我想将每一列添加为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]
输出:
但是,知道duration + credit_amount = credit_amount + duration
。我不想重复列。
可以从函数中获得预期结果:
我该怎么办?
我正在尝试使用哈希集,但似乎仅在熊猫系列[1]中起作用。
编辑: 数据框:https://www.openml.org/d/31
答案 0 :(得分:2)
使用以下内容,应该会更快:
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("---------------------------")
这将列的组合打印在一起。所以我只是在axis = 1上求和,并在pd.series下对其进行了命名,并通过加入它们来为其命名。
将此发布后,只需将其添加到列表中,并在axis = 1上合并即可获得最终结果。 :)
答案 1 :(得分:1)
您已经指向itertools.combinations
,这是这里的正确工具,它将为循环和重复列的问题节省一些时间。有关排列,组合等的更多详细信息,请参见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
上运行的任何其他功能。
答案 2 :(得分:0)
该函数可以再有一个条件来检查是否已将关联的添加项作为一列添加到数据框中,如下所示:
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)
我尚未在您的数据上对此进行测试。尝试让我知道它是否无效。