这似乎应该是直截了当的,但却让我感到难过。真的很喜欢能够遍历groupby操作的组,我从groupby获得了我想要的结果但是我无法将最终结果合并到一个数据帧中。所以基本上我有下面的代码可以捕获列表中的数据帧,但我不知道如何循环数据帧列表来制作一个数据帧:
dfs = []
for name, group in df.groupby('date', sort=False):
dfs.append(pd.DataFrame(pd.DataFrame(list(chain.from_iterable(group['values'])),
columns=['col']).groupby('col').size(),
columns=[name]).reset_index())
我得到以下内容(只显示dfs [0]和dfs [1]但我有dfs [8]:
[ col1 col2
0 val1 val2,
...
col1 col2
0 val1 val2]
...
我只想将它们全部合并到col1键上。换句话说,以下工作很好但是如何在不对列表中的各个元素进行硬编码并在dfs中循环遍历它们的情况下如何实现呢?
pd.concat([dfs[0], dfs[1]], axis=1, join='outer')
答案 0 :(得分:1)
为什么不呢:
pd.concat(dfs, axis=1, join='outer')
答案 1 :(得分:0)
因为这必须在一个非常大的数据集上工作,所以我选择了以下实现,它看起来并不优雅但在大型数据集上表现相当不错:
for name, group in df.groupby('date', sort=False):
dfs.append(pd.DataFrame(pd.DataFrame(list(chain.from_iterable(group['values'])),
columns=['key']).groupby('key').size(),
columns=[name.strftime('%Y-%m-%d')]).reset_index())
df2 = pd.concat(dfs, axis=1, join='outer')
df3 = pd.merge(pd.merge(pd.merge(pd.merge(pd.merge(pd.merge(pd.merge(pd.merge(df2.iloc[:, :2],
pd.DataFrame(list(set(chain.from_iterable(df['values']))), columns=['key']), how='right'),
df2.iloc[:, 2:4], how='left'),
df2.iloc[:, 4:6], how='left'),
df2.iloc[:, 6:8], how='left'),
df2.iloc[:, 8:10], how='left'),
df2.iloc[:, 10:12], how='left'),
df2.iloc[:, 12:14], how='left'),
df2.iloc[:, 14:16], how='left').fillna(0).set_index('key').sort_index(axis=1)