簡體   English   中英

Pandas Dataframe創建一個獨特的列

[英]Pandas Dataframe creating a unique column

我有這個數據幀: 在此輸入圖像描述

我想添加每列,作為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]

與輸出:

在此輸入圖像描述

  1. duration_sum_credit_amount
  2. duration_sum_installment_commitment
  3. credit_amount_sum_duration
  4. credit_amount_sum_installment_commitment
  5. installment_commitment_sum_duration
  6. installment_commitment_sum_credit_amount

但是,知道duration + credit_amount = credit_amount + duration 我不想重復列。 期望這個函數的結果:

  1. duration_sum_credit_amount
  2. duration_sum_installment_commitment
  3. credit_amount_sum_installment_commitment

我該怎么做?

我試圖使用哈希集,但似乎只適用於熊貓系列[1]

編輯:數據幀: https //www.openml.org/d/31

使用下面的,應該更快地工作:

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.series下調用它,並通過加入它們給它一個名字。

發布此信息只需將它們附加到列表中並在軸= 1上連接它們以獲得最終結果。 :)

您已經指向了itertools.combinations ,這是正確的工具,並且會為您節省一些循環和重復列的問題。 有關排列,組合等的更多詳細信息,請參閱文檔

首先,讓我們創建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上運行的任何其他函數。

該函數可以有一個if條件來檢查關聯添加是否已作為列添加到數據框,如下所示:

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)

我沒有在你的數據上測試過這個。 如果它不起作用,請嘗試告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM