[英]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.