按条件(分组)在 Pandas 中添加行

3

我在谷歌上搜索了很多关于这个问题的信息,但都没有找到适用于我的问题的答案。我的问题是,我有一个数据帧,每一行都有一个变量,我想不断地插入带有变量C的行,它是变量A + B的值。例如:

      TOWN        YEAR           Var     Value                 
      Amsterdam   2019            A        1
      Amsterdam   2019            B        2
      Amsterdam   2020            A        1
      Amsterdam   2020            B        3
      Rotterdam   2019            A        4
      Rotterdam   2019            B        4
      Rotterdam   2020            A        5
      Rotterdam   2020            B        2

如果其他列相同,则所需输出会插入一行并分别对 A 和 B 求和。我现在的尝试失败了,因为我使用了 groupby 和 sum,然后将其转换为列表,然后尝试将其附加到一个单独的列 (var_C) 中。它失败的原因是我必须复制每个值以匹配原始数据集的长度。最终,列表的长度与原始数据集的长度不匹配。

data_current = data[data['var'].isin(['A', 'B'])]
data_var_c = data_current.groupby(['TOWN', 'year'])['value'].sum()
values = data_var_c.tolist()
values_dup = [val for val in values for _ in (0, 1)]
len(values_dup)

欢迎提出任何反馈意见!

3个回答

5

您可以使用groupbypd.concat

result = (
    pd.concat([
        df,
        df.groupby(['TOWN', 'YEAR'], as_index=False)
        .agg(sum)
        .assign(Var = 'C')
        ])
    )

result = result.sort_values(['TOWN', 'YEAR', 'Var'])

输出:

       TOWN  YEAR Var  Value
0  Amsterdam  2019   A      1
1  Amsterdam  2019   B      2
0  Amsterdam  2019   C      3
2  Amsterdam  2020   A      1
3  Amsterdam  2020   B      3
1  Amsterdam  2020   C      4
4  Rotterdam  2019   A      4
5  Rotterdam  2019   B      4
2  Rotterdam  2019   C      8
6  Rotterdam  2020   A      5
7  Rotterdam  2020   B      2
3  Rotterdam  2020   C      7

1
谢谢你的回答!我会将其标记为适当的答案(因为你还给出了首选输出)。我发布的答案只是将其添加为一列。再次感谢! - ajayy

0

我把它复杂化了,其实只需要按TOWNYear进行分组,取value列并应用sum函数以获得总和:

data['c'] = data_current.groupby(['TOWN', 'year'])['value'].transform('sum')

然而,这并不是期望的输出,因为它会将总和作为另一列添加。而Nk03的答案则是将总和作为另一行添加。

0

一个枢轴堆栈选项:

import pandas as pd

df = pd.DataFrame({
    'TOWN': {0: 'Amsterdam', 1: 'Amsterdam', 2: 'Amsterdam', 3: 'Amsterdam',
             4: 'Rotterdam', 5: 'Rotterdam', 6: 'Rotterdam', 7: 'Rotterdam'},
    'YEAR': {0: 2019, 1: 2019, 2: 2020, 3: 2020, 4: 2019, 5: 2019, 6: 2020,
             7: 2020},
    'Var': {0: 'A', 1: 'B', 2: 'A', 3: 'B', 4: 'A', 5: 'B', 6: 'A', 7: 'B'},
    'Value': {0: 1, 1: 2, 2: 1, 3: 3, 4: 4, 5: 4, 6: 5, 7: 2}
})

new_df = df.pivot(index=['TOWN', 'YEAR'], columns='Var')['Value'] \
    .assign(C=lambda x: x.agg('sum', axis=1)) \
    .stack() \
    .rename('Value') \
    .reset_index()

print(new_df)

new_df:

         TOWN  YEAR Var  Value
0   Amsterdam  2019   A      1
1   Amsterdam  2019   B      2
2   Amsterdam  2019   C      3
3   Amsterdam  2020   A      1
4   Amsterdam  2020   B      3
5   Amsterdam  2020   C      4
6   Rotterdam  2019   A      4
7   Rotterdam  2019   B      4
8   Rotterdam  2019   C      8
9   Rotterdam  2020   A      5
10  Rotterdam  2020   B      2
11  Rotterdam  2020   C      7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接