串联熊猫列

时间:2019-06-24 19:00:59

标签: python-3.x pandas sklearn-pandas

我有一个这样的熊猫数据框:

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

我该如何实现?

2 个答案:

答案 0 :(得分:2)

我假设index是您的df的索引。您需要分别在set_indexcountrycumcountunstack

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