创建唯一列的数据帧

2024-09-30 01:18:21 发布

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

我有这个数据帧: enter image description here

我想添加每一列,如duration + credit_amount,因此我创建了以下算法:

def automate_add(add):
  for i, column in enumerate(df):
    for j, operando in enumerate(df):
        if column != operando:
            columnName = column + '_sum_' + operando
            add[columnName] = df[column] + df[operando]

输出:

enter image description here

  1. 期限\总额\贷方金额\
  2. 期限\总额\分期付款\承诺
  3. 信用证金额总额期限
  4. 信用证金额分期付款承诺
  5. 分期付款\承诺金额\期限
  6. 分期付款\承诺金额\信用证金额\

然而,知道duration + credit_amount = credit_amount + duration。我不想有重复的专栏。 期望函数产生以下结果:

  1. 期限\总额\贷方金额\
  2. 期限\总额\分期付款\承诺
  3. 信用证金额分期付款承诺

我该怎么做?你知道吗

我尝试使用散列集,但似乎只适用于熊猫系列[1]。你知道吗

编辑: 数据帧:https://www.openml.org/d/31


Tags: 数据inadddfforcolumn金额amount
3条回答

您已经被指向了itertools.combinations,这是这里的正确工具,它将为您保存一些for循环和重复列的问题。有关排列、组合等的详细信息,请参见documentation

首先,让我们创建DataFrame,这样我们就可以重现这个示例:

import pandas as pd
from itertools import combinations

df = pd.DataFrame({
    'a': [1,2,3],
    'b': [4,5,6],
    'c': [7,8,9]
})
>>> df
    a   b   c
0   1   4   7
1   2   5   8
2   3   6   9

现在我们开始工作吧。其思想是获取所有combinations列,然后执行字典理解以返回类似{column_name: sum}的内容。在这里:

>>> pd.DataFrame({c1 + '_sum_' + c2: df[c1] + df[c2] 
                  for c1, c2 in combinations(df.columns, 2)})

    a_sum_b a_sum_c b_sum_c
0   5       8       11
1   7       10      13
2   9       12      15

注意,您可以将sum替换为对两个pd.Series进行操作的任何其他函数。你知道吗

使用以下方法,应更快地工作:

import itertools

my_list=[(pd.Series(df.loc[:,list(i)].sum(axis=1),\
name='_sum_'.join(df.loc[:,list(i)].columns))) for i in list(itertools.combinations(df.columns,2))]    
final_df=pd.concat(my_list,axis=1)
print(final_df)

  duration_sum_credit_amount  duration_sum_installment_commitment  \
0                        1175                                   10   
1                        5999                                   50   
2                        2108                                   14   
3                        7924                                   44   
4                        4894                                   27   

   credit_amount_sum_installment_commitment  
0                                      1173  
1                                      5953  
2                                      2098  
3                                      7884  
4                                      4873  

解释: print(list(itertools.combinations(df.columns,2)))给出:

[('duration', 'credit_amount'),
('duration', 'installment_commitment'),
 ('credit_amount', 'installment_commitment')]

发布内容:

for i in list(itertools.combinations(df.columns,2)):
    print(df.loc[:,list(i)])
    print("             -")

这会将列的组合打印在一起。所以我把它加在轴=1上,然后把它叫做pd系列,并通过加入他们给它起了个名字。你知道吗

发布这个只需将它们附加到列表中,并将它们连接到axis=1即可得到最终结果。:)

函数可以有一个以上的if条件来检查关联的添加是否已作为列添加到dataframe,如下所示:

def automate_add(add):
  columnLst=[]
  #list where we will add column names to avoid the associate sum columns
  for i, column in enumerate(df):
    for j, operando in enumerate(df):
        if column != operando:
            if operando + '_sum_' + column not in columnLst:
                columnName = column + '_sum_' + operando
                add[columnName] = df[column] + df[operando]
                columnLst.append(columnName)

我还没用你的数据测试过。如果不行,试着告诉我。你知道吗

相关问题 更多 >

    热门问题