我有一个这样的熊猫数据框:
index country value1 value2 value3
0 USA 6 5 4
1 USA 4 7 3
2 USA 3 2 1
3 CAN 4 5 7
4 CAN 10 8 6
我想将其转换为面向列的数据框,如下所示,针对每个值(即value1,value2或value3)
value1的第一个数据帧应如下所示:
index USA CAN
0 6 4
1 4 10
2 3 NaN
我已经尝试过此代码
column = ['USA', 'CAN']
df_value1 = pd.DataFrame(columns=column)
temp = df['value1'].where(df['country']=='USA').dropna()
df_value1['USA'] = temp
temp = df['value1'].where(df['country']=='CAN').dropna()
pd.concat([df_value1, temp], axis=1, ignore_index=True)
由于CAN值从第3行开始,当我沿着列(axis = 1)进行连接时,我得到的结果是df_vaue1数据帧,如下所示:
index USA CAN
0 6 NaN
1 4 NaN
2 3 NaN
3 NaN 4
4 NaN 10
但是我想要这样的df_value1数据框:
index USA CAN
0 6 4
1 4 10
2 3 NaN
我该如何实现?
答案 0 :(得分:2)
我假设index
是您的df
的索引。您需要分别在set_index
和country
和cumcount
上unstack
df1 = df.set_index([df.groupby('country').cumcount(), 'country']).unstack()
如果index
是您的df
的一列,则需要另外添加drop
,如下所示
df1 = df.drop('index',1).set_index([df.groupby('country').cumcount(), 'country']).unstack()
Out[1959]:
value1 value2 value3
country CAN USA CAN USA CAN USA
0 4.0 6.0 5.0 5.0 7.0 4.0
1 10.0 4.0 8.0 7.0 6.0 3.0
2 NaN 3.0 NaN 2.0 NaN 1.0
从上面的df1
,如果您需要value1
,只需按以下步骤进行切片:
df1['value1']
Out[1960]:
country CAN USA
0 4.0 6.0
1 10.0 4.0
2 NaN 3.0
答案 1 :(得分:2)
您需要:
import itertools
dataframes = {}
for v in df.filter(like='value').columns:
nest = [df[v].loc[col] for col in cols]
dataframes[v] = pd.DataFrame((y for y in itertools.zip_longest(*nest)), columns=cols)
因此dataframes['value1']
给出:
USA CAN
0 6 4.0
1 4 10.0
2 3 NaN