Python 与 DataFrame 聚合合并 ...error: '' 既是索引级别又是列标签,这是不明确的

Posted

技术标签:

【中文标题】Python 与 DataFrame 聚合合并 ...error: \'\' 既是索引级别又是列标签,这是不明确的【英文标题】:Python with DataFrame merge of aggregations ...error: '' is both an index level and a column label, which is ambiguousPython 与 DataFrame 聚合合并 ...error: '' 既是索引级别又是列标签,这是不明确的 【发布时间】:2020-06-17 00:23:44 【问题描述】:
import pandas as pd

data1 = [
'File': '7396ee8aea09.json', 'Last': '2019-04-25 20:24:28+00:00', 'Size': 78796, 'COLA': 'STANDARD', 
'File': '7777682e4/ip/done', 'Last': '2019-04-24 21:45:01+00:00', 'Size': 4, 'COLA': 'CUSTOM', 
'File': 'erparameters.json', 'Last': '2019-04-24 21:45:01+00:00', 'Size': 351, 'COLA': 'STANDARD'
]
data2 = [
'File': '3343e4/ip/ip.json', 'Last': '2019-04-24 21:45:01+00:00', 'Size': 20, 'COLA': 'STANDARD', 
'File': 'ta-00000-of-00001', 'Last': '2019-04-24 22:43:17+00:00', 'Size': 140216236, 'COLA': 'STANDARD', 
'File': '-20514.ckpt.index', 'Last': '2019-04-24 22:43:17+00:00', 'Size': 3168, 'COLA': 'STANDARD', 
]
# right now 2 for the prova but could be much more..
datas = [data1, data2]
results = None 
for data in datas:
  df = pd.DataFrame(data, columns=['COLA','Size','Last'])\
              .groupby(['COLA'])\
              .agg(
                  'COLA': [('COLA', 'max'), ('Count', 'count')],
                  'Size': [('Size', 'sum')],
                  'Last': [('Last', 'max')]
                  )
  df.columns = ['COLA', 'Count', 'Size', 'Last']

  if results is None:
    results = df
  else:
    results = results.merge(df,
                   on=['COLA', 'Count', 'Size', 'Last'],
                   how='outer',
                   )\
             .groupby(['COLA'], as_index=False)\
             .agg(
                   'COLA': [('COLA', 'max'), ('Count', 'sum')],
                   'Size': [('Size', 'sum')],
                   'Last': [('Last', 'max')]
                 )

print (results)

预期结果采用该格式:

COLA 拥有所有独特的 COLA 标签 Size 是该 COLA 标签组的所有“Size”的总和 套。 Count 是该 COLA 标签组在所有集合中的总计数。 Last 是所有集合中该 COLA 标签组的最大日期。

例子:

results = [
     'COLA': 'STANDARD', 'Size': 140298571, 'Count': 5, 'Last': '2019-04-25 20:24:28+00:00', 
     'COLA': 'CUSTOM',   'Size': 4,         'Count': 1, 'Last': '2019-04-24 21:45:01+00:00'
]

【问题讨论】:

【参考方案1】:

您可以连接所有数据并进行分组:

df = pd.concat(pd.DataFrame(d) for d in datas)

(df.groupby('COLA').agg('COLA':'count',
                        'Size':'max',
                        'Last':'max')
  .rename(columns='COLA':'Count')
  .reset_index()
  .to_dict('rows')
)

输出:

['COLA': 'CUSTOM',
  'Count': 1,
  'Size': 4,
  'Last': '2019-04-24 21:45:01+00:00',
 'COLA': 'STANDARD',
  'Count': 5,
  'Size': 140216236,
  'Last': '2019-04-25 20:24:28+00:00']

更新:我没有尝试过,但这应该可以工作并且需要更少的内存:

df = pd.concat(pd.DataFrame(d)
                 .groupby('COLA')
                 .agg('COLA':'count',
                       'Size':'max',
                       'Last':'max')
                 .rename(columns='COLA':'Count')
               for data in datas
               )

df.groupby('COLA').agg('Count':'sum', 'Size':'max', 'last':'max')

【讨论】:

如果每个数据集中有数百万行,会不会导致内存问题? 只要将所有数据集加载到datas,我想你就可以了。如果没有,您可以使用相同的命令 groupby for 循环中的每个数据集,将结果和 groupby 再次连接,这次与 'Count':'sum' 聚合,而不是 rename 谢谢!这确实简化了我的代码并减少了许多循环。另一个问题是当 .to_dict('rows') ...它给我的标签为 ('COLA',''): 和 ('Count','Count '): ... 我不确定,该代码适用于示例数据。也许你的数据有点不同。 问题出在我做 agg 的方式上......我没有注意到你所做的改变......现在一切都好!非常感谢!!

以上是关于Python 与 DataFrame 聚合合并 ...error: '' 既是索引级别又是列标签,这是不明确的的主要内容,如果未能解决你的问题,请参考以下文章

Python数据分析笔记#8.2.2 索引上的合并

数据规整:聚合合并和重塑

在 Python 3.x 中将基于特定列的列和值的两个 DataFrame 与 Pandas 合并

如何在Python Pandas中将MultiIndex Dataframes与权重合并?

Python Pandas 中 DataFrame 的聚合?

Python数据分析笔记#8.2.3 轴向连接