【问题标题】:DataFrame in pandas, group and aggregate in the same row熊猫中的DataFrame,在同一行中进行分组和聚合
【发布时间】:2023-02-07 21:07:11
【问题描述】:

我试图从行中生成差异列。 这是我的代码:

d = {'PARENT_PART': ['KRC161262', 'KRC161262', 'KRC161833', 'KRC161834', 'KRC161834'], 'CITY': ['BARCELONA', 'MADRID', 'BARCELONA', 'BARCELONA', 'MADRID'], 'GOOD_OR_FAULTY': ['GOOD', 'GOOD', 'GOOD','GOOD','FAULT']}

df = pd.DataFrame(data=d)

grouped1 = df.groupby(['PARENT_PART', 'CITY']).size().reset_index(name='counts')

for index, row in grouped1.iterrows():    
    ciudad = row['CITY']    
    codigo = row['PARENT_PART']
    counts = grouped1.loc[(grouped1['PARENT_PART'] == codigo) & (grouped1['CITY'] == ciudad), 'counts'].values[0]
    df.loc[index, ciudad] = counts
print(df)

使用这段代码,我得到了

  PARENT_PART       CITY GOOD_OR_FAULTY  BARCELONA  MADRID
0   KRC161262  BARCELONA           GOOD        1.0     NaN
1   KRC161262     MADRID           GOOD        NaN     1.0
2   KRC161833  BARCELONA           GOOD        1.0     NaN
3   KRC161834  BARCELONA           GOOD        1.0     NaN
4   KRC161834     MADRID          FAULT        NaN     1.0

我的目标是,对于每个重复的 PARENT PART,创建一个包含 CITY 的新列并添加 1(如计数器)

我的预期结果

  PARENT_PART  GOOD_OR_FAULTY  BARCELONA  MADRID
0   KRC161262  GOOD            1.0        1.0
2   KRC161833  GOOD            1.0        NaN
3   KRC161834  GOOD            1.0        1.0

你能帮助我吗!?

提前致谢

【问题讨论】:

  • 是否预期 KRC161834 的 MADRID 即使是 FAULT 也会得到 1?
  • 也许您正在寻找pivot_table?特别是 aggfunc 选项

标签: python pandas dataframe


【解决方案1】:

您可以为此使用数据透视表:

df_pivot = df.pivot_table(
    index='PARENT_PART', 
    columns='CITY', 
    values='GOOD_OR_FAULTY', 
    aggfunc='count'
).reset_index()

CITY PARENT_PART  BARCELONA  MADRID
0      KRC161262        1.0     1.0
1      KRC161833        1.0     NaN
2      KRC161834        1.0     1.0

【讨论】:

    【解决方案2】:

    首先,你可以通过crosstab获取第一部分:

    pd.crosstab([df['PARENT_PART'], df['GOOD_OR_FAULTY']], df['CITY']).reset_index()
    

    输出:

    CITY PARENT_PART GOOD_OR_FAULTY  BARCELONA  MADRID
    0      KRC161262           GOOD          1       1
    1      KRC161833           GOOD          1       0
    2      KRC161834          FAULT          0       1
    3      KRC161834           GOOD          1       0
    

    或者pivot_table

    (df.assign(value=1)
       .pivot_table(index=['PARENT_PART', 'GOOD_OR_FAULTY'], columns='CITY', values='value')
    )
    

    输出:

    CITY PARENT_PART GOOD_OR_FAULTY  BARCELONA  MADRID
    0      KRC161262           GOOD        1.0     1.0
    1      KRC161833           GOOD        1.0     NaN
    2      KRC161834          FAULT        NaN     1.0
    3      KRC161834           GOOD        1.0     NaN
    

    如果您还想聚合:

    agg = {k: 'sum' for k in df['CITY'].unique()}
    agg['GOOD_OR_FAULTY'] = '/'.join
    
    (pd.crosstab([df['PARENT_PART'], df['GOOD_OR_FAULTY']], df['CITY']).reset_index()
       .groupby(['PARENT_PART'], as_index=False).agg(agg)
    )
    

    输出:

    CITY PARENT_PART  BARCELONA  MADRID GOOD_OR_FAULTY
    0      KRC161262        1.0     1.0           GOOD
    1      KRC161833        1.0     0.0           GOOD
    2      KRC161834        1.0     1.0     FAULT/GOOD
    

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 2021-12-14
      • 1970-01-01
      • 2020-04-18
      • 2017-04-09
      • 1970-01-01
      • 2023-04-01
      • 2018-04-25
      • 1970-01-01
      相关资源
      最近更新 更多