我得到一个这样的数据框:
A YEAR2000 B YEAR2001 C YEAR2002
a 1 b 3 a 7
b 3 c 5 e 6
c 6 d 2 f 3
e 1 g 0
每两列切片一次,然后重新组织以形成新的数据框,如下所示:
type YEAR2000 YEAR2001 YEAR2002
a 1 7
b 3 3
c 6 5
d 2
e 1 6
f 3
g 0
我尝试过pd.concat()
,但是出了点问题!谢谢。
答案 0 :(得分:1)
我认为您可以先用groupby
然后用axis=1
来使用concat
l=[y.set_index(y.columns[0]).dropna() for x , y in df.groupby(np.arange(df.shape[1])//2,axis=1)]
pd.concat(l,axis=1,sort=True)
Out[858]:
YEAR2000 YEAR2001 YEAR2002
a 1.0 NaN 7.0
b 3.0 3.0 NaN
c 6.0 5.0 NaN
d NaN 2.0 NaN
e NaN 1.0 6.0
f NaN NaN 3.0
g NaN NaN 0.0
答案 1 :(得分:1)
使用两次合并即可实现。
df1 = pd.DataFrame([['a', 1], ['b', 3], ['c', 6]],columns=['letter', 'number'])
df2 = pd.DataFrame([['b', 3], ['c', 5], ['d', 2], ['e', 1]],columns=['letter', 'number'])
df3 = pd.DataFrame([['a', 7], ['e', 6], ['f', 3], ['g', 0]],columns=['letter', 'number'])
pd.merge(pd.merge(df1, df2, how='outer', on='letter'), df3, how='outer', on='letter')
为获得更干净的外观:
df1.merge(df2, how='outer', on='letter').merge(df3, how='outer', on='letter')
如果您有多个数据框,请将其放入列表中,并使用带有reduce的理解。
from functools import reduce
dfs = [df1, df2, df3]
reduce(lambda left, right: left.merge(right, how='outer', on='letter'), dfs)
答案 2 :(得分:0)
我的代码如下:
dataframe_list = []
for i in range(0,origin_df.columns.size):
if i % 2 == 0:
dataframe_list.append(origin_df.iloc[:,[i,i + 1]])
new_dataframe = pd.DataFrame()
new_dataframe = pd.concat(dataframe_list,axis = 0)
new_dataframe
答案 3 :(得分:0)
只要您有6列以上:
num_cols = len(df.columns)
pd.concat([df.iloc[:,i:i+2].dropna()
.set_index(df.columns[i])
for i in range(0,len(df.columns),2)],
axis=1,
sort=True
)
输出:
YEAR2000 YEAR2001 YEAR2002
a 1.0 NaN 7.0
b 3.0 3.0 NaN
c 6.0 5.0 NaN
d NaN 2.0 NaN
e NaN 1.0 6.0
f NaN NaN 3.0
g NaN NaN 0.0
答案 4 :(得分:0)
我认为简单的解决方案是使用pd.concat
。仅需要set_index
到A
之前的这些子数据帧的B
,C
,pd.concat
...列中。对于具有未知名称的大量列的df
,可以通过使用iter
和zip
轻松完成,如下所示:
it = iter(df)
cols_list = list(map(list, zip(it, it)))
Out[1854]: [['A', 'YEAR2000'], ['B', 'YEAR2001'], ['C', 'YEAR2002']]
接下来,使用listcomp创建set_index
和cols_list
中的pd.concat
的子数据帧列表
dfs = [df[cols].set_index(cols[0]) for cols in cols_list]
pd.concat(dfs, axis=1).dropna(axis=0, how='all')
Out[1868]:
YEAR2000 YEAR2001 YEAR2002
a 1.0 NaN 7.0
b 3.0 3.0 NaN
c 6.0 5.0 NaN
d NaN 2.0 NaN
e NaN 1.0 6.0
f NaN NaN 3.0
g NaN NaN 0.0