将值插入已知列pandas中命名的列

时间:2017-04-26 09:14:37

标签: python pandas bigdata

我正在为机器学习准备数据,其中数据在pandas DataFrame中,如下所示:

Column   v1    v2
first    1      2
second   3      4
third    5      6

现在我想将其转换为:

Column  v1  v2  first-v1  first-v2  second-v1  econd-v2  third-v1  third-v2
first   1   2     1        2         Nan        Nan       Nan      Nan
second  3   4     Nan      Nan       3          4         Nan      Nan
third   5   6     Nan      Nan       Nan        Nan       5        6

我试过的是做这样的事情:

# we know how many values there are but 
# length can be changed into length of [1, 2, 3, ...] values
values = ['v1', 'v2']

# data with description from above is saved in data 
for value in values:
    data[ str(data['Column'] + '-' + value)] = data[ value]

结果是一个名称为的列: ['first-v1' 'second-v1'..], ['first-v2' 'second-v2'..] 哪里有正确的价值观。我做错了什么?有没有更好的方法来做到这一点,因为我的数据很大?

感谢您的时间!

1 个答案:

答案 0 :(得分:2)

您可以使用unstack在列中交换和排序MultiIndex

df = data.set_index('Column', append=True)[values].unstack()
         .swaplevel(0,1, axis=1).sort_index(1)
df.columns = df.columns.map('-'.join)
print (df)
   first-v1  first-v2  second-v1  second-v2  third-v1  third-v2
0       1.0       2.0        NaN        NaN       NaN       NaN
1       NaN       NaN        3.0        4.0       NaN       NaN
2       NaN       NaN        NaN        NaN       5.0       6.0

stack + unstack

df = data.set_index('Column', append=True).stack().unstack([1,2])
df.columns = df.columns.map('-'.join)
print (df)
   first-v1  first-v2  second-v1  second-v2  third-v1  third-v2
0       1.0       2.0        NaN        NaN       NaN       NaN
1       NaN       NaN        3.0        4.0       NaN       NaN
2       NaN       NaN        NaN        NaN       5.0       6.0

上次join原创:

df = data.join(df)
print (df)
   Column  v1  v2  first-v1  first-v2  second-v1  second-v2  third-v1  \
0   first   1   2       1.0       2.0        NaN        NaN       NaN   
1  second   3   4       NaN       NaN        3.0        4.0       NaN   
2   third   5   6       NaN       NaN        NaN        NaN       5.0   

   third-v2  
0       NaN  
1       NaN  
2       6.0