【问题标题】:Pandas split CSV into multiple CSV's (or DataFrames) by a columnPandas 按列将 CSV 拆分为多个 CSV(或 DataFrame)
【发布时间】:2018-06-08 23:23:15
【问题描述】:

遇到一个问题,我很迷茫,我们将不胜感激。

问题:我有一个 csv 文件,其中有一列可能包含多个值,例如:

Fruit;Color;The_evil_column
Apple;Red;something1
Apple;Green;something1
Orange;Orange;something1
Orange;Green;something2
Apple;Red;something2
Apple;Red;something3

我已将数据加载到数据框中,我需要根据“The_evil_column”列的值将该数据框拆分为多个数据框:

df1
Fruit;Color;The_evil_column
Apple;Red;something1
Apple;Green;something1
Orange;Orange;something1

df2
Fruit;Color;The_evil_column
Orange;Green;something2
Apple;Red;something2

df3
Fruit;Color;The_evil_column
Apple;Red;something3

在阅读了一些帖子后,我更加困惑,我需要一些关于此的提示。

【问题讨论】:

    标签: python python-2.7 pandas csv pandas-groupby


    【解决方案1】:

    您可以生成 DataFrame 的字典:

    d = {g:x for g,x in df.groupby('The_evil_column')}
    
    In [95]: d.keys()
    Out[95]: dict_keys(['something1', 'something2', 'something3'])
    
    In [96]: d['something1']
    Out[96]:
        Fruit   Color The_evil_column
    0   Apple     Red      something1
    1   Apple   Green      something1
    2  Orange  Orange      something1
    

    或数据帧列表:

    In [103]: l = [x for _,x in df.groupby('The_evil_column')]
    
    In [104]: l[0]
    Out[104]:
        Fruit   Color The_evil_column
    0   Apple     Red      something1
    1   Apple   Green      something1
    2  Orange  Orange      something1
    
    In [105]: l[1]
    Out[105]:
        Fruit  Color The_evil_column
    3  Orange  Green      something2
    4   Apple    Red      something2
    
    In [106]: l[2]
    Out[106]:
       Fruit Color The_evil_column
    5  Apple   Red      something3
    

    更新:

    In [111]: g = pd.read_csv(filename, sep=';').groupby('The_evil_column')
    
    In [112]: g.ngroups   # number of unique values in the `The_evil_column` column
    Out[112]: 3
    
    In [113]: g.apply(lambda x: x.to_csv(r'c:\temp\{}.csv'.format(x.name)))
    Out[113]:
    Empty DataFrame
    Columns: []
    Index: []
    

    会产生3个文件:

    In [115]: glob.glob(r'c:\temp\something*.csv')
    Out[115]:
    ['c:\\temp\\something1.csv',
     'c:\\temp\\something2.csv',
     'c:\\temp\\something3.csv']
    

    【讨论】:

    • 喜欢那个 dict 一代(很高兴知道!)但我想要的是完美运行的列表,现在我试着在计算有多少邪恶的东西后使用 to_csv 存储数据的功能邪恶的专栏。非常感谢!!
    • @EliasCortAguelo,很高兴我能帮上忙。你的最终目标是什么?用The_evil_column 列拆分一个CSV?
    • 是的,这就是我的想法,我有一个名为 counter 的变量,其值为 0 和一个 for 循环,如 """ for result in range(len(d)): counter += 1 print l[counter ]""",它返回 3 个数据帧,但最终错误为“IndexError: list index out of range”""。
    • 哇,太棒了,谢谢!!这正是我所需要的,真的很好。非常非常感谢 MaxU,在您的帮助下学到了很多!
    • 这就是为什么访问df 是通过l[i][1] ;)
    【解决方案2】:

    您可以通过列的值过滤框架:

    frame=pd.read_csv('file.csv',delimiter=';')
    frame['The_evil_column']=='something1'
    

    返回:

    0     True
    1     True
    2     True
    3    False
    4    False
    5    False
    Name: The_evil_column, dtype: bool
    

    因此您访问这些列:

    frame1 = frame[frame['The_evil_column']=='something1']
    

    稍后您可以删除该列:

    frame1 = frame1.drop('The_evil_column', axis=1)
    

    【讨论】:

      【解决方案3】:

      更简单但效率较低的方法是:

      data = pd.read_csv('input.csv')
      
      out = []
      
      for evil_element in list(set(list(data['The_evil_column']))):
          out.append(data[data['The_evil_column']==evil_element])
      

      out 将拥有所有数据数据框的列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-14
        • 2020-11-30
        • 2018-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-27
        相关资源
        最近更新 更多