簡體   English   中英

在同一熊貓數據框中合並兩列

[英]Merge two columns in the same pandas dataframe

我有一個必須合並多對列的數據框。 這些列包含互斥數據。 也就是說,如果列A中有一個值,則列B中該行的值將為空。

df = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
               'A': ['A0', '', 'A2', ''],
               'B': ['', 'B1', '', 'B3'],
               'C': ['C1','C2','',''],
               'D': ['','','D3','D4']})

所以我有這樣的事情:

    A   B   C   D key
0  A0      C1      K0
1      B1  C2      K1
2  A2          D3  K2
3      B3      D4  K3

我想合並A列和B列,以便所有值最終都在A列中。我還希望以C和D形式進行此操作,同時保持索引和其他任何列(如Key)不變。 我可以分多個步驟進行操作。 我不需要同時進行AB合並和CD合並。 理想情況下,我最終得到:

    A   C key
0  A0  C1  K0
1  B1  C2  K1
2  A2  D3  K2
3  B3  D4  K3

我已經嘗試過df = df.A.combine_first(df.B)但那無濟於事。

這是使用zip來匹配每兩列的解決方案

li = zip(df.columns[0::2],df.columns[1::2])
#[('A', 'B'), ('C', 'D')] 
# I assume columns are pairs and end up with lenght as odd number with additional column.
# If you want to ignore last column manually you can use 
# li = zip(df.columns[0:-1:2],df.columns[1:-1:2]) # slice `start:end:step`

temp = pd.DataFrame({i :df[i]+df[j] for i,j in li})

ndf = pd.concat([temp,df['key']],1)

#    A   C key
# 0  A0  C1  K0
# 1  B1  C2  K1
# 2  A2  D3  K2
# 3  B3  D4  K3

如果您可以先將空字符串轉換為NaN,則可以嘗試通過以下方式使用Series.fillna

import numpy as np

df = df.replace('', np.nan)

df.A = df.A.fillna(df.B)
df.C = df.C.fillna(df.D)

這使:

df

    A    B   C    D key
0  A0  NaN  C1  NaN  K0
1  B1   B1  C2  NaN  K1
2  A2  NaN  D3   D3  K2
3  B3   B3  D4   D4  K3

這將用B列中的值填充A列中的缺失值,然后將結果序列設置為df A列。 我們可以使用循環將這種想法擴展到多列的情況:

l_cols = df.columns[0::2]  # Left columns in the pairs
r_cols = df.columns[1::2]  # Right columns in the pairs  

# Go through each pair
for l, r in zip(l_cols, r_cols):
    df[l] = df[r].fillna(df[r])

可以使用以下命令從輸出中排除用於合並的列:

df = df.drop(r_cols, axis=1)

暫無
暫無

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

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