【发布时间】:2015-09-28 09:15:41
【问题描述】:
这是上一篇文章中的link。我在下面引用P.R.'s 回复。
import pandas as pd
import glob
interesting_files = glob.glob("*.csv")
df_list = []
for filename in sorted(interesting_files):
df_list.append(pd.read_csv(filename))
full_df = pd.concat(df_list)
full_df.to_csv('output.csv')
我想知道如何使用熊猫修改上述内容。具体来说,我试图递归地移动目录并将所有 CSV 标头及其各自的行值连接起来,然后将其写入一个文件中。使用 P.R 的方法,导致所有标题及其对应的值相互堆叠。我的限制是:
写出标题及其对应的值(没有“堆叠”) - 基本上是一个接一个地连接
如果一个文件中的列标题与另一个文件匹配,则它们不应重复。在写入一个 CSV 文件时,仅应附加这些值。
由于每个文件都有不同的列标题和不同数量的列标题,这些都应该被添加。不应该删除任何内容。
我也尝试了以下方法:
import pandas as pd
import csv
import glob
import os
path = '.'
files_in_dir = [f for f in os.listdir(path) if f.endswith('csv')]
for filenames in files_in_dir:
df = pd.read_csv(filenames)
df.to_csv('out.csv', mode='a')
这里有两个示例 CSV:
ID,Type,ACH,SH,LL,SS,LS,ISO,MID,Pass,TID,CID,TErrors
12821767,Query,,,,,,,,,,,
和
Type,ID,CC,CCD,Message,MemberIdentifier,NPass,UHB,UAP,NewAudioPIN,AType,ASuufix,Member,Share,Note,Flag,Card,MA,Preference,ETF,AutoT,RType,Locator,ISO,MID,Pass,TID,CID,Errors
UMember,12822909,True,10/31/2013 5:22:19 AM,,,,False,False,,,,,,,,,,,,,Member,,,,,,,
基于以上示例,输出应类似于以下内容:
ID,Type,ACH,SH,LL,SS,LS,ISO,MID,Pass,TID,CID,TErrors,CC,CCD,Message,MemberIdentifier,NPass,UHB,UAP,NewAudioPIN,AType,ASuufix,Member,Share,Note,Flag,Card,MA,Preference,ETF,AutoT,RType,Locator,Errors
12822909,UMember,,,,,,,,,,,,True,10/31/2013 5:22:19 AM,,,,False,False,,,,,,,,,,,,,Member,,
12821767,Query ,,,,,,,,,,,,,,,,,,,,,,,,, etc.
(第二个示例中的所有标题列都应使用分隔符','填充第一个示例中没有对应标题的第二行)
可以看到,第二个示例有更多的列标题。此外,一些 标题相同(但顺序不同)。我正在尝试结合所有 这些 - 以及它们的值,遵循上述要求。我是 想知道最好的方法是在一个 pandas的内置方法?
【问题讨论】:
-
对于您发布的示例,期望的结果是什么?
-
你有什么特别的理由想在这里使用
pandas- 我想没有它会更容易......(有趣的新名字@HappyLeapSecond!) -
@HappyLeapSecond 我试图用要点来说明这一点——如果不把它画出来就很难解释。所有标题都应位于一个“行”/“行”中,而值应位于随后的“行”中。常见的标题不应重复,但应添加与每个标题对应的值。应保持顺序,不应删除任何标题或值。应自动添加任何新标头(连同其值)。
-
@JonClements 我认为 pandas 将是最有效的方法。如果您有其他建议,我欢迎您的想法。
-
@890319ahlusar 每个 CSV 文件只有一个数据行吗?
标签: python csv pandas merge concatenation