Python 读取特定文件夹中的所有csv文件,合并它们,并找到w.r.t.行间隔的最大值

Python 读取特定文件夹中的所有csv文件,合并它们,并找到w.r.t.行间隔的最大值,python,pandas,dataframe,join,concatenation,Python,Pandas,Dataframe,Join,Concatenation,我有120个csv文件。它包括索引号、日期、日期、温度等 这里的索引列从1到8760不等。 我想从文件夹中读取所有csv文件,并将它们合并到单个文件中。 一旦我合并了这些文件,我将拥有所有索引No 120次,I.e索引No 1将拥有120行 在此之后,我必须为每个索引编号找到耳环的最大值,即索引编号1到8760,并打印该最大耳环值行 import pandas , OS, glob path = r'C:\Data_Input' # use your path all_files = glo

我有120个csv文件。它包括索引号、日期、日期、温度等

这里的索引列从1到8760不等。 我想从文件夹中读取所有csv文件,并将它们合并到单个文件中。 一旦我合并了这些文件,我将拥有所有索引No 120次,I.e索引No 1将拥有120行

在此之后,我必须为每个索引编号找到耳环的最大值,即索引编号1到8760,并打印该最大耳环值行

import pandas , OS, 
glob path = r'C:\Data_Input' # use your path 
all_files = glob.glob(path + "/*.csv") 
# print(all_files) 
li = [] 
for filename in all_files: 
     df = pd.read_csv(filename, skiprows=10, names=None, engine='python',header=0, encoding='unicode_escape') 
     df = df.assign(File_name=os.path.basename(filename).split('.')[0]) 
     li.append(df) 
     frame = pd.concat(li, axis=0, ignore_index=True, sort=False)


frame = frame.dropna() 
df = frame.assign(max_EArray=frame.groupby('IndexNo')['EArray'].transform('max')) df_filtered = df[df['EArray'] == df['max_EArray']] 
output = df_filtered.loc[df_filtered.ne(0).all(axis=1)]('max_EArray', axis=1) print(output.shape) 
output.to_csv('temp.csv') 

您的任务可以很容易地完成使用dask而不是纯熊猫

一个优点是,开箱即用,您有可能获得 已从中读取特定行的源文件的名称

我的解决办法如下:

如果尚未安装dask,请安装dask

导入dask.dataframe:

定义一个函数来重新格式化在上单独调用的数据帧 从特定.csv文件读取的每个部分数据帧:

在这里,您可以使用普通代码。它也改变了道路, 剥离目录路径,只保留不带扩展名的文件名

定义一个函数以在分组后从每个组中获取最大行数 按索引编号:

运行实际处理:

ddf = dd.read_csv('EArray/*.csv', include_path_column=True)
ddf = ddf.map_partitions(reformat)
ddf = ddf.groupby('IndexNo').apply(getMax, meta={'EArray': 'i4', 'path': 'O'})
df = ddf.compute().sort_index().reset_index()
说明:

“array/*.csv”-一组源文件的规范。 我将所有源文件放在一个专用的子文件夹array中。 include_path_column=True-将路径列添加到数据帧,其中包含 每行读取的文件的完整路径。 映射分区…-分别对每个 部分数据帧。 群比。。。并申请…-一般来说,就像熊猫一样。 meta-dask名称规范中需要的附加参数 以及输出数据帧中的列类型。 计算-运行由前面的指令准备的处理树。 现在,结果是正常的数据帧。 排序索引和重置索引-对计算结果执行操作。 对于测试,我准备了3.csv文件,每个文件有10行:

T1.csv:

   IndexNo        date  EArray
0     1001  2019-01-01      20
1     1002  2019-01-02      20
2     1003  2019-01-03      20
3     1004  2019-01-04      20
4     1005  2019-01-05      20
5     1006  2019-01-06      20
6     1007  2019-01-07      20
7     1008  2019-01-08      20
8     1009  2019-01-09      20
9     1010  2019-01-10      20
T2.csv:

   IndexNo        date  EArray
0     1001  2019-01-11      22
1     1002  2019-01-12      23
2     1003  2019-01-13      24
3     1004  2019-01-14      25
4     1005  2019-01-15      26
5     1006  2019-01-16      27
6     1007  2019-01-17      28
7     1008  2019-01-18      29
8     1009  2019-01-19      30
9     1010  2019-01-20      31
T3.csv:

   IndexNo        date  EArray
0     1001  2019-01-21      35
1     1002  2019-01-22      34
2     1003  2019-01-23      33
3     1004  2019-01-24      32
4     1005  2019-01-25      31
5     1006  2019-01-26      30
6     1007  2019-01-27      29
7     1008  2019-01-28      28
8     1009  2019-01-29      28
9     1010  2019-01-30      26
我的计划的结果是:

   IndexNo  EArray path
0     1001      35   T3
1     1002      34   T3
2     1003      33   T3
3     1004      32   T3
4     1005      31   T3
5     1006      30   T3
6     1007      29   T3
7     1008      29   T2
8     1009      30   T2
9     1010      31   T2
例如,对于IndexNo==1001,ARRAY的值为: 20、22和35 foreach输入文件

IndexNo==1001的结果包含:

耳环==35-上述3项中的最大值, T3-包含max行的源文件。 我知道你必须学习dask,但在我看来 为此付出一些努力是值得的

请注意,我的代码非常清晰简洁。
函数只有7行,主程序只有4行。

为了让社区帮助您,您需要表明您已经尝试构建了一些代码。因此,请发布您提出的解决方案的代码,并让我们知道您的具体问题所在。然后社区可能能够提供帮助。导入pandas,OS,glob path=r'C:\Data\u Input“使用您的路径所有\u文件=glob.globpath+/*.csv printall\u文件li=[]作为所有\u文件中的文件名:df=pd.read\u csvfilename,skiprows=10,name=None,engine='python',header=0,encoding='unicode\u escape'df=df.assignFile\u name=os.path.basenamefilename.split'.[0]li.appenddf frame=pd.concatli,axis=0,ignore\u index=True,sort=false frame=frame.dropna df=frame.assignmax\u array=frame.groupby'IndexNo'['array'.]转换'max'df\u filtered=df[df['array']==df['max\u array']]输出=df\u filtered.loc[df_filtered.ne0.allaxis=1]'max_array',axis=1 printoutput.shape output.to_csv'temp.csv'非常感谢您,此程序运行良好。@Valdi_-Bo
   IndexNo        date  EArray
0     1001  2019-01-11      22
1     1002  2019-01-12      23
2     1003  2019-01-13      24
3     1004  2019-01-14      25
4     1005  2019-01-15      26
5     1006  2019-01-16      27
6     1007  2019-01-17      28
7     1008  2019-01-18      29
8     1009  2019-01-19      30
9     1010  2019-01-20      31
   IndexNo        date  EArray
0     1001  2019-01-21      35
1     1002  2019-01-22      34
2     1003  2019-01-23      33
3     1004  2019-01-24      32
4     1005  2019-01-25      31
5     1006  2019-01-26      30
6     1007  2019-01-27      29
7     1008  2019-01-28      28
8     1009  2019-01-29      28
9     1010  2019-01-30      26
   IndexNo  EArray path
0     1001      35   T3
1     1002      34   T3
2     1003      33   T3
3     1004      32   T3
4     1005      31   T3
5     1006      30   T3
6     1007      29   T3
7     1008      29   T2
8     1009      30   T2
9     1010      31   T2