【问题标题】:Iterate over different length df & export to csv迭代不同长度的df并导出到csv
【发布时间】:2020-10-28 18:59:41
【问题描述】:

当我的 df2, Group2 有第三个项目“B3”时,我得到了我想要的关于 groupby 的内容。当数组长度不同时如何获得输出?
我也很难将所有数据都保存到 CSV,而不仅仅是最后一次迭代。我尝试在循环之前制作 df,然后将其合并,但有些东西不起作用。

import pandas as pd
df1 = pd.DataFrame({'Title': ['A1', 'A2', 'A3', 'B1', 'B2', 'C13'], 
                    'Whole': ['full', 'full', 'full', 'semi', 'semi', 'semi']})

df2 = pd.DataFrame({'Group1': ['A1', 'A2', 'A3'], 
                    'Group2': ['B1', 'B2']})

for column in df2.columns:
    
    d_group = df1[df1.Title.isin(df2[column])]
        
    df = d_group.groupby('Whole')['Whole'].count()\
                    .rename('Column Name from df2')\
                    .reindex(['part', 'full', 'semi'], fill_value='-')\
                    .reset_index()
    
    df.T.to_csv('all_groups2.csv', header=False, index=True)
    print(df.T)

期望的输出:


    Whole   | part    | full     | semi
    --------+---------+----------+----------
    Group1  | -       | 3        | -
    Group2  | -       | -        | 2

【问题讨论】:

  • 目前尚不清楚预期的输出是什么。您能否将您想要的输出发布为表格?
  • 完成,如果您在 df2 中将“B3”添加到 Group2,则代码有效

标签: python pandas dataframe for-loop export-to-csv


【解决方案1】:

在 Pandas Dataframe 中,它应该有具有相同形状的列(或行)。因此,您的代码中不可能有df2

我建议改用系列,如下所示:

df1 = pd.DataFrame({'Title': ['A1', 'A2', 'A3', 'B1', 'B2', 'C13'], 
                    'Whole': ['full', 'full', 'full', 'semi', 'part', 'semi']})
group1 = pd.Series(['A1', 'A2', 'A3'])
group2 = pd.Series(['B1', 'B2'])

然后,您可以通过isin函数过滤和分组数据框df1

dfg1 = df1[df1['Title'].isin(group1)].groupby('Whole').count()
dfg2 = df1[df1['Title'].isin(group2)].groupby('Whole').count()

最后通过concataxis=1 加入他们:

res = pd.concat([dfg1, dfg2], axis=1)
res.columns = ['Group1','Group2']
finaldf = res.T

结果如下:

        full  part  semi
Group1   3.0   NaN   NaN
Group2   NaN   1.0   1.0

最后,您可以使用与以前相同的代码将其写入 CSV:

finaldf.to_csv('result.csv', header=False, index=True)

我建议不要逐行写入文件,除非它是一个非常大的文件并且您无法将其存储在内存中。在这种情况下,我建议分区或使用 Dask。

【讨论】:

  • 我明白了,这就是我真正开始的方式,但我有这么多小组,这似乎不是一个好的选择。
  • 如果你有很多组并且你想使用数据框,你可以将系列(例如group1,group2)与concat结合起来,比如df2 = pd.concat([group1,group2],axis=1)。它将 NaN 放在形状不匹配的位置。
【解决方案2】:

我刚刚意识到我可以将我的 df2 加载为 pd.series,并遍历索引而不是列,以到达我想要的位置。

import pandas as pd
df1 = pd.DataFrame({'Title': ['A1', 'A2', 'A3', 'C1', 'C2', 'C3'], 
                    'ID': ['B1', 'B2', 'B3', 'A1', 'D2', 'D3'], 
                    'Whole': ['full', 'full', 'full', 'semi', 'semi', 'semi']})

df2 = pd.Series({'Group1': ['A1', 'A2', 'A3'], 
                 'Group2': ['B1', 'B2']})

df = pd.DataFrame()

for index in df2.index:
    
    d_group = (df1[df1.ID.isin(df2[index])])
     
    df3 = d_group.groupby('Whole')['Whole'].count()\
                .rename(index, inplace=True)\
                .reindex(['part', 'full', 'semi'], fill_value='-')
    df = df.append(df3, ignore_index=False, sort=False)
        
print(df)

【讨论】:

    猜你喜欢
    • 2021-08-31
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2022-01-23
    • 2017-10-15
    • 2019-05-02
    相关资源
    最近更新 更多