我有几百个* csv文件,当导入到pandas数据框时,如下所示:
import pandas as pd
df = pd.read_csv("filename1.csv")
df
column1 column2 column3 column4
0 10 A 1 ID1
1 15 A 1 ID1
2 19 B 1 ID1
3 5071 B 0 ID1
4 5891 B 0 ID1
5 3210 B 0 ID1
6 12 B 2 ID1
7 13 C 2 ID1
8 20 C 0 ID1
9 5 C 3 ID1
10 9 C 3 ID1
每个* csv文件都有column4
的唯一ID(每行具有相同的元素)。
我想创建一个新的csv文件,其中每个文件名都是一行,保留column4
的ID /值以及max
和column1
的{{1}}值}。什么是最好的熊猫方式?
ID1 5891 3 ....
我的想法是:
column3
但是,(1)我不知道这是否有效;(2)我不知道最终csv的尺寸是否正确。另外,如何处理缺少import numpy as np
import pandas as pd
files = glob.glob("*.csv") # within the correct subdirectory
newdf1 = pd.DataFrame()
for file in newdf1:
df = pd.read_csv(file)
df["ID"] = df.column4.unique()
df["max_column1"] = df.column2.max()
df["max_column3"] = df.column3.max()
newdf1 = newdf1.append(df, ignore_index=True)
newdf1.to_csv("totalfile.csv")
或column1
的* csv?也就是说,它应该“传递”这些值。
这样做的正确方法是什么?
答案 0 :(得分:1)
我认为您可以按文件循环,按iat
和max
获取第一个值并附加到list
。
然后使用DataFrame
构造函数并写入文件。
files = glob.glob("*.csv") # within the correct subdirectory
L = []
for file in files:
df = pd.read_csv(file)
u = df.column4.iat[0]
m1 = df.column1.max()
m2 = df.column3.max()
L.append({'ID':u,'max_column1':m1,'max_column3':m2})
newdf1 = pd.DataFrame(L)
newdf1.to_csv("totalfile.csv")
编辑:
L = []
for file in files:
print (file)
df = pd.read_csv(file)
#print (df)
m1, m2 = np.nan, np.nan
if df.columns.str.contains('column1').any():
m1 = df.column1.max()
if df.columns.str.contains('column3').any():
m2 = df.column3.max()
u = df.column4.iat[0]
L.append({'ID':u,'max_column1':m1,'max_column3':m2})
newdf1 = pd.DataFrame(L)
答案 1 :(得分:1)
重复附加到pandas DataFrame
的效率非常低,因为它会复制DataFrame。
相反,您可以直接在结果文件中写入找到的最大值。
files = glob.glob("*.csv")
with open("totalfile.csv", "w") as fout:
for f in files:
df = pd.read_csv(f)
result = df.loc[:, ['column4', 'column2', 'column3']].max()\
.fillna('pass').to_dict()
fout.write("{column4},{column2},{column3}\n".format(**result))
df.loc[:, ['column4', 'column2', 'column3']]
会为缺少的列返回NaN
个已填充的列。只有在缺少所有三列时才会引发异常。
fill_na('pass')
将替换缺失值。