gpt4 book ai didi

python - Pandas 对多个 csv 文件中匹配日期的列求和

转载 作者:行者123 更新时间:2023-12-03 21:47:12 25 4
gpt4 key购买 nike

我正在使用 Pandas 1.1.2 和 Python 3.6
我在一个文件夹中有 CV 文件,所有文件都具有以下格式(文件中没有标题):
样本.csv

2001-01-01,43,1000
2001-01-02,37,42.5
第一列是日期,其余列是数字。我想对文件夹中的所有 *.cv 文件进行 glob,并在所有文件中存在的日期的数字列中添加数字
这是我到目前为止的代码(可能与优化有关):
例子.py
from pathlib import Path
from datetime import datetime as dt
import pandas as pd

ROOT_DIR='/some/path'
DATA_COL_DATE = 'dt'
COL_NAMES = ('dt','weight','age')

dates = []

# First get all dates available
pathlist = Path(ROOT_DIR).glob('**/*.csv')
for filename in pathlist:
# because filename is object not string
with open (str(filename), 'r') as f:
temp = list(set([dt.strptime(x[0], DATE_FORMAT) for x in f.readlines()]))
dates.extend(temp)

dates.sort()

# Second pass :/
for filename in pathlist:
# because filename is object not string
df = pd.read_csv(str(filename), names=COL_NAMES, header=None, parse_dates=parse_dates)
df2 = df.set_index(df[DATA_COL_DATE])
df2.sort_index(inplace=True)

# ... now what?
如何按日期对列求和 - 条件是只有在所有文件中具有行的日期才会在聚合结果中求和?

最佳答案

我认为我们可以使用 pandas 和 pathlib 稍微整理一下:

import pandas as pd 
from pathlib import Path


def gather_files(root_dir):
if not Path(root_dir).is_dir():
raise FileNotFoundError('Directory is not valid!')
return [file for file in Path(root_dir).glob('*.csv')]


def return_summed_dataframe(list_of_csv_paths):
dfs = pd.concat(
[pd.read_csv(file,parse_dates='dt').assign(src=file.stem)
for file in list_of_csv_paths]
)

de_duped_df = dfs[dfs.duplicated(subset='dt',keep=False)]

de_duped_df = de_duped_df[de_duped_df.groupby('dt')['src'].transform('size')\
.ge(len(list_of_csv_paths))]

return de_duped_df.groupby('dt').sum()
用法。
files = gather_files('path/to/files')

df = return_summed_dataframe(files)

df.to_csv(...)
他们这里的关键是 duplicated()keep=False这将返回所有重复值 - 意味着日期至少必须存在于 +1 源文件中。
其次,我们可以做一个 size()src用于测试每个唯一日期是否至少大于我们文件的长度的列。 (文件可能有重复的日期,因此大小可能大于文件的长度)
以这个 df 为例。
  src        date
0 A 01-01-2020
1 A 01-01-2020
2 B 01-01-2020
3 B 01-03-2020
4 C 01-01-2020
5 C 01-03-2020
首先我们按日期查找重复项,暂时忽略 src。
src = ['A','B','C']
df1 = df[df.duplicated(subset='date',keep=False)]

print(df1)

src date
0 A 01-01-2020
1 A 01-01-2020
2 B 01-01-2020
3 B 01-03-2020
4 C 01-01-2020
5 C 01-03-2020
#if you have duplicate dates in each file we can do an initial groupby
# df1.groupby('date').agg(size=('size','sum),weight=('weight','sum'),
# src=('src','first')
final = df1[df1.groupby('date')['src'].transform('size').ge(len(src))]


print(final)

src date
0 A 01-01-2020
1 A 01-01-2020
2 B 01-01-2020
4 C 01-01-2020

关于python - Pandas 对多个 csv 文件中匹配日期的列求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63900444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com