Python 如何基于列值拆分数据帧中的行?

Python 如何基于列值拆分数据帧中的行?,python,pandas,dataframe,split,rows,Python,Pandas,Dataframe,Split,Rows,我试图根据列中是否存在值将行拆分为多行。我可以根据列值进行筛选,但希望根据条件将行拆分为两行,并仅返回行的特定部分。数据框由不同类型的付款组成,活动字段表示发生的付款类型。我想知道什么时候有一个特定的付款类型将行拆分为两个。在下面的示例中,当存在付款2时,我希望它是一个单独的交易 我有以下数据帧: ID Payment 1 Payment 2 Payment 3 Payment 4 Payment 5 Activity 1

我试图根据列中是否存在值将行拆分为多行。我可以根据列值进行筛选,但希望根据条件将行拆分为两行,并仅返回行的特定部分。数据框由不同类型的付款组成,活动字段表示发生的付款类型。我想知道什么时候有一个特定的付款类型将行拆分为两个。在下面的示例中,当存在付款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

这里的问题是您希望同时更改
付款
列和
活动
列。因此,实际上,我只看到迭代数据帧并根据条件
row['Payment 2']==0
将新行写入新数据帧的天真方法,如下所示:

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
,则追加源数据框中的原始行

有关拆分行的相关问题(仅基于一列,不涉及其他列):


这是一种更好的方法,但您可以对
付款2“
”付款2“
执行
str.split(expand=True)
。这样,当付款2存在时,您就有一列付款2