【问题标题】:Merge specific rows which have the same ID value in a specific column in pandas DataFrame在 pandas DataFrame 的特定列中合并具有相同 ID 值的特定行
【发布时间】:2022-11-20 23:08:44
【问题描述】:

我有一个 DataFrame df1IDAmount 在特定的 Dates 上。我尝试总结具有相同 ID 值的两个特定行的 Amount

df1:
    Date        ID      Amount
0   2022-01-02  1200    10.0
1   2022-01-02  1200    1.0
2   2022-01-02  1400    12.0
3   2022-01-02  1500    11.0
4   2022-01-03  1300    12.5
5   2022-01-03  1300    0.5
6   2022-01-03  1500    12.0

这将是所需的输出:

df1:
    Date        ID      Amount
0   2022-01-02  1200    11 <-- 10+1
1   2022-01-02  1200    0  <-- -1
2   2022-01-02  1400    12
3   2022-01-02  1500    11
4   2022-01-03  1300    13 <-- 12.5+0.5
5   2022-01-03  1300    0  <-- -0.5
6   2022-01-03  1500    12

我尝试用 np.where() 替换 Amount,其中 shifted ID 值等于 ID 值。

对于可重复性:

import pandas as pd
df1 = pd.DataFrame({
    'Date':['2022-01-02', '2022-01-02', '2022-01-02', '2022-01-02', '2022-01-03', '2022-01-03', '2022-01-03'],
    'ID':[1200, 1200, 1400, 1500, 1300, 1300, 1500],
    'Amount':[10, 1, 12, 11, 12.5, 0.5, 12]})

非常感谢您的帮助!

【问题讨论】:

  • 您只想对紧邻的下一行或数据集中的任何地方执行此操作吗?换句话说,它是针对具有匹配“ID”的所有记录还是仅针对彼此相邻的记录。
  • 如果整个数据集有一种有效的方法,那就太好了。非常感谢!

标签: python pandas dataframe shift


【解决方案1】:

如果我正确理解你的问题,它看起来像一个交易数据,你需要的组是 [Date, ID]。

如果是这样,那么您可以将其实现为:

df1["Amount"] = df1.groupby(["Date", "ID"])["Amount"].transform(lambda x: [x.sum() if i==0 else 0 for i,_ in enumerate(x)])

完整的例子。我在数据集的末尾添加了一些额外的数据,只是为了测试超过 2 个条目的角条件:

import pandas as pd

df1 = pd.DataFrame({
    'Date':['2022-01-02', '2022-01-02', '2022-01-02', '2022-01-02', '2022-01-03', '2022-01-03', '2022-01-03', '2022-01-04', '2022-01-04', '2022-01-04'],
    'ID':[1200, 1200, 1400, 1500, 1300, 1300, 1500, 1500, 1500, 1500],
    'Amount':[10, 1, 12, 11, 12.5, 0.5, 12, 10, 3, 5]})

df1["Amount"] = df1.groupby(["Date", "ID"])["Amount"].transform(lambda x: [x.sum() if i==0 else 0 for i,_ in enumerate(x)])

print(df1)

[Out]:
         Date    ID  Amount
0  2022-01-02  1200    11.0
1  2022-01-02  1200     0.0
2  2022-01-02  1400    12.0
3  2022-01-02  1500    11.0
4  2022-01-03  1300    13.0
5  2022-01-03  1300     0.0
6  2022-01-03  1500    12.0
7  2022-01-04  1500    18.0
8  2022-01-04  1500     0.0
9  2022-01-04  1500     0.0

【讨论】:

    【解决方案2】:

    让我们试试下面的代码:

    Amount=[None]*len(df1)
    
    for i in range(1, len(df1)):
    
        if df1['ID'][i] == df1['ID'][i-1]:
    
            Amount[i]   = df1['Amount'][i] - df1['Amount'][i]
            Amount[i-1] = df1['Amount'][i] + df1['Amount'][i-1]
    
        else:
    
            Amount[i] = df1['Amount'][i]
    
    df1['Amount']=Amount
    

    输出

    >>> df1
            Date    ID  Amount
    0   2022-01-02  1200    11.0
    1   2022-01-02  1200    0.0
    2   2022-01-02  1400    12.0
    3   2022-01-02  1500    11.0
    4   2022-01-03  1300    13.0
    5   2022-01-03  1300    0.0
    6   2022-01-03  1500    12.0
    

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2018-02-09
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2014-01-18
      • 2021-12-30
      • 2020-12-23
      • 2014-09-21
      相关资源
      最近更新 更多