2016-05-30 194 views
2

嗨我在排序熊猫数据框中的某些数据时遇到问题。数据的格式与我习惯的不同,我不知道如何使它工作。我要排序的数据是这样的格式:按列中的名称对熊猫数据框中的数据进行排序

[['2016-05-23', 'name1', 'data1'], 
['2016-05-23', 'name2', 'data2'], 
['2016-05-24', 'name1', 'data1'], 
['2016-05-24', 'name2', 'data2'], 
['2016-05-25', 'name1', 'data1'], 
['2016-05-25', 'name2', 'data2'], 
['2016-05-26', 'name1', 'data1'], 
['2016-05-26', 'name2', 'data2'], 
['2016-05-27', 'name1', 'data1'], 
['2016-05-27', 'name2', 'data2']] 

我想要做的就是把它sortet的日期,并与名称科拉姆名。

[['2016-05-23, 'data1', 'data2'], 
['2016-05-24', 'data1', 'data2'], 
['2016-05-25', 'data1', 'data2'] and so on...] 

是否有可能通过一些特定的熊猫命令做到这一点,我还想解决方案使用更多,只是两个名称列。我不知道如何做到这一点,并会提供任何帮助。

回答

2

我想你需要pivot

import pandas as pd 

df = pd.DataFrame([['2016-05-23', 'name1', 'data1'], 
['2016-05-23', 'name2', 'data2'], 
['2016-05-24', 'name1', 'data1'], 
['2016-05-24', 'name2', 'data2'], 
['2016-05-25', 'name1', 'data1'], 
['2016-05-25', 'name2', 'data2'], 
['2016-05-26', 'name1', 'data1'], 
['2016-05-26', 'name2', 'data2'], 
['2016-05-27', 'name1', 'data1'], 
['2016-05-27', 'name2', 'data2']], columns = ['a','b','c']) 

print (df) 
      a  b  c 
0 2016-05-23 name1 data1 
1 2016-05-23 name2 data2 
2 2016-05-24 name1 data1 
3 2016-05-24 name2 data2 
4 2016-05-25 name1 data1 
5 2016-05-25 name2 data2 
6 2016-05-26 name1 data1 
7 2016-05-26 name2 data2 
8 2016-05-27 name1 data1 
9 2016-05-27 name2 data2 
#convert column a to datetime 
df['a'] = pd.to_datetime(df.a) 

print (df.pivot(index='a', columns='b', values='c')) 
b   name1 name2 
a      
2016-05-23 data1 data2 
2016-05-24 data1 data2 
2016-05-25 data1 data2 
2016-05-26 data1 data2 
2016-05-27 data1 data2 

,然后如果你需要sort_values例如通过name1柱:

import pandas as pd 

df = pd.DataFrame([['2016-05-23', 'name1', 9], 
['2016-05-23', 'name2', 4], 
['2016-05-24', 'name1', 5], 
['2016-05-24', 'name2', 1], 
['2016-05-25', 'name1', 5], 
['2016-05-25', 'name2', 7], 
['2016-05-26', 'name1', 10], 
['2016-05-26', 'name2', 7], 
['2016-05-27', 'name1', 0], 
['2016-05-27', 'name2', 1]], columns = ['a','b','c']) 
print (df) 
      a  b c 
0 2016-05-23 name1 9 
1 2016-05-23 name2 4 
2 2016-05-24 name1 5 
3 2016-05-24 name2 1 
4 2016-05-25 name1 5 
5 2016-05-25 name2 7 
6 2016-05-26 name1 10 
7 2016-05-26 name2 7 
8 2016-05-27 name1 0 
9 2016-05-27 name2 1 

print (df.pivot(index='a', columns='b', values='c').sort_values('name1')) 
b   name1 name2 
a      
2016-05-27  0  1 
2016-05-24  5  1 
2016-05-25  5  7 
2016-05-23  9  4 
2016-05-26  10  7 

有时pivot不工作,然后使用pivot_table

print (df.pivot_table(index='a', columns='b', values='c')) 

pivot_table使用aggfunc,默认为aggfunc=np.mean是否重复。样品更好的解释是heredocs


最后你可以reset_indexrename_axis(新中pandas0.18.0):

print (df.pivot(index='a', columns='b', values='c') 
     .reset_index() 
     .rename_axis(None, axis=1)) 
      a name1 name2 
0 2016-05-23  9  4 
1 2016-05-24  5  1 
2 2016-05-25  5  7 
3 2016-05-26  10  7 
4 2016-05-27  0  1 

#pandas bellow 0.18.0 
df1 = df.pivot(index='a', columns='b', values='c').reset_index() 
df1.columns.name = None 
print (df1) 
      a name1 name2 
0 2016-05-23  9  4 
1 2016-05-24  5  1 
2 2016-05-25  5  7 
3 2016-05-26  10  7 
4 2016-05-27  0  1 
+0

谢谢,这似乎是工作,有没有办法让这个组合成一个新的数据帧?我厌倦了在新的DataFrame中打印(df.pivot(index ='a',columns ='b',values ='c')。sort_values('a')),以便按日期排序没有工作 – Siesta

+0

但'a'是索引,它被分类...如果不是,你可以使用'df1 = df.pivot(index ='a',columns ='b',values ='c')。reset_index ().sort_values('a')' – jezrael

+0

我还添加了将字符串列a转换为datetime的代码,请参阅编辑。 – jezrael

相关问题