将每个组的行合并为一行

2024-06-16 12:32:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我对熊猫很有经验,但偶然发现了一个我似乎无法解决的问题

我有一个很大的数据集((40000,16)),我正试图通过一个特定的列(“group_name”来对其进行分组,然后对每个组应用以下规则,以便将其合并到每个组的一行中:

  • x1、x2、x3是“重要”列,如果一行的空值比其他行少,则使用它。(见D行示例)
  • 如果在任何列中有冲突,它是任意的,我们可以选择任何内容
  • 将重要字段(x1、x2、x3)上的空值组合在一起,请参见带行A的示例

下面是一个示例,其中6行应分成4组(也称为4行)

Input, result and some explanations.

到目前为止我有 groups = df.groupby['group_name']

我尝试了许多其他的解决方案,例如对每个组求和、应用转换、按每个“重要”列聚合、合并每个“重要”列等等。 每个解决方案都会带来自己的问题,所以我在这里提出这个问题,而不是以某种方式限制人们

此外,我花了近两天时间将其他问题的不同解决方案结合起来,但似乎都不起作用。也许我错过了什么

  • 请注意,由于这是一个大型数据集,我非常希望避免在每个组中使用^ {CD2}}循环,因为这里有效率要考虑。李>

我希望我把一切都解释清楚,如果有不清楚的地方请告诉我

重新创建数据帧的代码(感谢第一个答案中的@Henry Ecker):

df = pd.DataFrame({
    'group_name': ['A', 'A', 'B', 'C', 'D', 'D'],
    'z1': ['value1', 'different_value', 'value1',
           'value1', 'value99', 'value999'],
    'z2': ['value2'] * 4 + ['value100', 'value1000'],
    'z3': ['value3'] * 4 + ['value101', 'value101'],
    'zN': ['valueN'] * 5 + ['valueN200'],
    'x1': ['a', None, None, 'abc', 'xx', None],
    'x2': [None, 'b', None, 'def', 'yy', None],
    'x3': [None, None, None, None, 'zz', 'ff']
})

Tags: 数据namenone示例dfgroup经验解决方案
1条回答
网友
1楼 · 发布于 2024-06-16 12:32:43

尝试使用^{}'first'从每个group_name的每个列中获取第一个(有效)值:

new_df = df.groupby('group_name', as_index=False).agg('first')

new_df

  group_name       z1        z2        z3      zN    x1    x2    x3
0          A   value1    value2    value3  valueN     a     b  None
1          B   value1    value2    value3  valueN  None  None  None
2          C   value1    value2    value3  valueN   abc   def  None
3          D  value99  value100  value101  valueN    xx    yy    zz

*请注意,如果这些是字符串'null'^{},请先将其取出+^{}以将其放回:

new_df = (
    df.mask(df.eq('null'))
        .groupby('group_name', as_index=False).agg('first')
        .fillna('null')
)

new_df

  group_name       z1        z2        z3      zN    x1    x2    x3
0          A   value1    value2    value3  valueN     a     b  null
1          B   value1    value2    value3  valueN  null  null  null
2          C   value1    value2    value3  valueN   abc   def  null
3          D  value99  value100  value101  valueN    xx    yy    zz

使用的数据帧:

  group_name               z1         z2        z3         zN    x1    x2    x3
0          A           value1     value2    value3     valueN     a  None  None
1          A  different_value     value2    value3     valueN  None     b  None
2          B           value1     value2    value3     valueN  None  None  None
3          C           value1     value2    value3     valueN   abc   def  None
4          D          value99   value100  value101     valueN    xx    yy    zz
5          D         value999  value1000  value101  valueN200  None  None    ff
df = pd.DataFrame({
    'group_name': ['A', 'A', 'B', 'C', 'D', 'D'],
    'z1': ['value1', 'different_value', 'value1',
           'value1', 'value99', 'value999'],
    'z2': ['value2'] * 4 + ['value100', 'value1000'],
    'z3': ['value3'] * 4 + ['value101', 'value101'],
    'zN': ['valueN'] * 5 + ['valueN200'],
    'x1': ['a', None, None, 'abc', 'xx', None],
    'x2': [None, 'b', None, 'def', 'yy', None],
    'x3': [None, None, None, None, 'zz', 'ff']
})

使用字符串'null'的数据帧:

  group_name               z1         z2        z3         zN    x1    x2    x3
0          A           value1     value2    value3     valueN     a  null  null
1          A  different_value     value2    value3     valueN  null     b  null
2          B           value1     value2    value3     valueN  null  null  null
3          C           value1     value2    value3     valueN   abc   def  null
4          D          value99   value100  value101     valueN    xx    yy    zz
5          D         value999  value1000  value101  valueN200  null  null    ff
df = pd.DataFrame({
    'group_name': ['A', 'A', 'B', 'C', 'D', 'D'],
    'z1': ['value1', 'different_value', 'value1',
           'value1', 'value99', 'value999'],
    'z2': ['value2'] * 4 + ['value100', 'value1000'],
    'z3': ['value3'] * 4 + ['value101', 'value101'],
    'zN': ['valueN'] * 5 + ['valueN200'],
    'x1': ['a', 'null', 'null', 'abc', 'xx', 'null'],
    'x2': ['null', 'b', 'null', 'def', 'yy', 'null'],
    'x3': ['null', 'null', 'null', 'null', 'zz', 'ff']
})

相关问题 更多 >