可重現的資料
import pandas as pd
import numpy as np
cols1=['b','a','c','a']
data1=[0,0,0,0]
df1=pd.DataFrame([data1], columns= cols1)
df1
cols2=['b','a', 'd', 'a', 'e','f']
data2=[1,1,1,1,1,1]
df2=pd.DataFrame([data2], columns= cols2)
df2
我想要的結果
data = { "b": [0, 1],
"b a" : [0, 1],
"c" : [0, np.NaN],
"c a" : [0, np.NaN],
"d" : [np.NaN, 1],
"d a" : [np.NaN, 1],
"e" : [np.NaN, 1],
"f" : [np.NaN, 1]}
pd.DataFrame(data)
如果 df 有重復的列名“a”,我不能使用“concat”函式。
任何處理重復列名的好方法?
如果“a”之前有一個“b”,我想將對應的a更改為“b a”。
uj5u.com熱心網友回復:
它不是標準的去重列名,如果不是連續重復的列名,則此方法a,b,b,b有效b,a,b,a :
s1 = df1.columns.to_series()
df1.columns = [f'{b} {a}' if c else a for a, b, c in zip(df1.columns, s1.shift(fill_value=''), s1.duplicated(keep=False))]
s2 = df2.columns.to_series()
df2.columns = [f'{b} {a}' if c else a for a, b, c in zip(df2.columns, s2.shift(fill_value=''), s2.duplicated(keep=False))]
df = pd.concat([df1, df2])
print (df)
b b a c c a d d a e f
0 0 0 0.0 0.0 NaN NaN NaN NaN
0 1 1 NaN NaN 1.0 1.0 1.0 1.0
顯然去重列名是按位置來完成的,這里是a重復的,所以加了1。但輸出不同:
s1 = df1.columns.to_series()
df1.columns = s1.str.cat(s1.groupby(s1).cumcount().astype(str), sep=' ').str.replace(' 0','', regex=True)
s2 = df2.columns.to_series()
df2.columns = s2.str.cat(s2.groupby(s2).cumcount().astype(str), sep=' ').str.replace(' 0','', regex=True)
df = pd.concat([df1, df2], ignore_index=True)
print (df)
b a c a 1 d e f
0 0 0 0.0 0 NaN NaN NaN
1 1 1 NaN 1 1.0 1.0 1.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494887.html
