【问题标题】:How to split rows in a dataframe based on column value?如何根据列值拆分数据框中的行?
【发布时间】:2020-11-05 19:11:17
【问题描述】:

我正在尝试根据列中是否存在值将我的行拆分为多行。我能够根据列值进行过滤,但想根据条件将行分成两部分,并只返回行的特定部分。数据框由不同类型的付款组成,活动字段表示发生的付款类型。我想在有特定的付款类型时将行分成两部分。在下面的示例中,当付款 2 存在时,我希望它是一个单独的交易。

我有以下数据框:

ID      Payment 1      Payment 2      Payment 3    Payment 4    Payment 5      Activity 
1          10             0              0            0              0         Payment 1  
2          0              10             15           0              0         Payment 2, Payment 3
3          10             20             30           0              0         Payment 1, Payment 2, Payment 3

但我希望数据框是:

ID      Payment 1      Payment 2      Payment 3    Payment 4    Payment 5       Activity 
 1          10             0              0            0              0         Payment 1  
 2          0              10             0            0              0         Payment 2
 2          0              0              15           0              0         Payment 3
 3          10             0              30           0              0         Payment 1, Payment 3
 3          0              20             0            0              0         Payment 2

【问题讨论】:

  • 可能会有更好的方法,但您可以在 "Payment 2,"", Payment 2" 上执行 str.split(expand=True)。这样一来,当它们存在时,您就有了一列付款 2

标签: python pandas dataframe split rows


【解决方案1】:

这里的问题是您想同时更改Payment 列和Activity 列。所以实际上,我只看到遍历 DataFrame 并根据条件row['Payment 2'] == 0 将新行写入新 DataFrame 的幼稚方法,如下所示:

df_new = pd.DataFrame(columns=['ID', 'Payment 1', 'Payment 2', 'Payment 3', 'Payment 4', 'Payment 5', 'Activity'])
for index, row in df.iterrows():
  if row['Payment 2'] == 0:
    df_new = df_new.append(row)
  else:
    row_new = pd.DataFrame({'ID':[row['ID']], 'Payment 1':[row['Payment 1']], 'Payment 2':[0], 'Payment 3':[row['Payment 3']], 'Payment 4':[row['Payment 4']], 'Payment 5':[row['Payment 5']], 'Activity':[', '.join([x for x in ['Payment 1', 'Payment 3', 'Payment 4', 'Payment 5'] if row[x] != 0])]})
    df_new = df_new.append(row_new)
    row_new = pd.DataFrame({'ID':[row['ID']], 'Payment 1':[0], 'Payment 2':[row['Payment 2']], 'Payment 3':[0], 'Payment 4':[0], 'Payment 5':[0], 'Activity':'Payment 2'})
    df_new = df_new.append(row_new)

如果有Payment 2,这将追加两个新行(一个只包含Payment 2,另一个包含其余行),如果没有Payment 2,则追加源DataFrame中的原始行。

关于拆分行的相关问题(仅基于一列,其他列保持不变):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2019-01-11
    相关资源
    最近更新 更多