簡體   English   中英

將多列合並為一列大熊貓

[英]consolidating multiple columns into one column pandas

我有一個具有多個以相同值結尾的列的df。 我想將各列合並為最后一列。 例如,任何以“ _1”結尾的列都應進入標記為“ final_1”的新列。 如果'_1'中的所有值均為'1',則final_1中的值將為1;否則,例如,如果'_1'列中至少有一個不是'1'的值,則final_1的值為0。

如果我的解釋不正確,則原始和最終結果數據幀會更清晰。

df = pd.DataFrame({'KEY': ['100000003', '100000009', '100000009', '100000009'], 
              'RO_1': [1, 1, 4,1],
              'RO_2': [1, 0, 0,0],
              'RO_3': [1, 1, 1,1],
              'en_1': [1, 4, 1,1],
              'en_2': [1, 4, 1,0],
              'en_3': [1, 4, 4,0],
              'ao_1': [1, 4, 1,1],
              'ao_2': [1, 4, 1,0],
              'ao_3': [1, 4, 4,0] })

    KEY         RO_1    RO_2    RO_3    ao_1    ao_2    ao_3    en_1    en_2    en_3
0   100000003   1       1       1       1       1       1       1       1       1
2   100000009   4       0       1       1       1       4       1       1       4
3   100000009   1       0       1       1       0       0       1       0       0

最后結果:

   KEY          RO_1    RO_2    RO_3    ao_1    ao_2    ao_3    en_1    en_2    en_3  Final1  Final2  Final3
0   100000003   1       1       1       1       1       1       1       1       1     1       1       1
2   100000009   4       0       1       1       1       4       1       1       4     0       0       0
3   100000009   1       0       1       1       0       0       1       0       0     1       0       0

我目前的嘗試。 因為有3個不同的列,所以我正在使用循環。 然后將原始df與新框架(mc)結合在一起。 但是我沒什么不同..

for i in range(1,4):
    mc = df.filter(regex='^_' + str(i)).isin([1]).astype(int).rename(columns=lambda x: x.replace('_', 'Final'))
df= pd.concat([df, mc], axis=1)

@DSM提出了一個更好的選項來拆分列名稱:

In [170]: cols = df.columns.drop('KEY')

In [171]: d = (df[cols]
                 .groupby(cols.str.split('_').str[-1], axis=1)
                 .all()
                 .astype(int)
                 .add_prefix('Final_'))

In [172]: df.join(d)
Out[172]:
         KEY  RO_1  RO_2  RO_3  ao_1  ao_2  ao_3  en_1  en_2  en_3  Final_1  Final_2  Final_3
0  100000003     1     1     1     1     1     1     1     1     1        1        1        1
1  100000009     1     0     1     4     4     4     4     4     4        1        0        1
2  100000009     4     0     1     1     1     4     1     1     4        1        0        1
3  100000009     1     0     1     1     0     0     1     0     0        1        0        0

或(c)@DSM和@piRSquared的解決方案:

In [194]: df.join(df.drop('KEY', 1)
                    .eq(1) 
                    .groupby(lambda c: c.rsplit('_', 1)[1], 1)
                    .all().astype(int).add_prefix('Final'))
Out[194]:
         KEY  RO_1  RO_2  RO_3  ao_1  ao_2  ao_3  en_1  en_2  en_3  Final1  Final2  Final3
0  100000003     1     1     1     1     1     1     1     1     1       1       1       1
1  100000009     1     0     1     4     4     4     4     4     4       0       0       0
2  100000009     4     0     1     1     1     4     1     1     4       0       0       0
3  100000009     1     0     1     1     0     0     1     0     0       1       0       0

如果您的結構是預定義的,那么numpy提供了一種有效的解決方案:

n = 3
v = df.iloc[:,1:].values
v[v!=1] = 0

for i in range(1, n+1):
    df['Final'+str(i)] = (np.all(v[:, [i-1+n*k for k in range(n)]], axis=1)).astype(int)

#          KEY  RO_1  RO_2  RO_3  ao_1  ao_2  ao_3  en_1  en_2  en_3  Final1  \
# 0  100000003     1     1     1     1     1     1     1     1     1       1   
# 1  100000009     1     0     1     4     4     4     4     4     4       0   
# 2  100000009     4     0     1     1     1     4     1     1     4       0   
# 3  100000009     1     0     1     1     0     0     1     0     0       1   

#    Final2  Final3  
# 0       1       1  
# 1       0       0  
# 2       0       0  
# 3       0       0  

暫無
暫無

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

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