我有一个DataFrame:
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],
'C' : np.asarray([1,2,3,4,5,6,7,8])
'D' : np.asarray([2,3,4,5,6,7,8,9])})
A C D
0 foo 1 2
1 bar 2 3
2 foo 3 4
3 bar 4 5
4 foo 5 6
5 bar 6 7
6 foo 7 8
7 foo 8 9
我想要的是
A C D
0 foo [1,3,5,7,8] [2,4,6,8,9]
1 bar [2,4,6] [3,5,7]
我自己写了一些东西,但它不起作用。它给了我原始的DataFrame:
def my_func(df):
df.apply(lambda x: list(x.values), axis=0)
return df
df = df.groupby(['A']).apply(my_func)
print df
如何实现我想要的功能?
答案 0 :(得分:3)
这样做,使用.agg()
:
In [15]:
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],
'C' : np.asarray([1,2,3,4,5,6,7,8]),
'D' : np.asarray([2,3,4,5,6,7,8,9])})
In [16]:
print df.groupby('A').agg(lambda x: list(x))
C D
A
bar [2, 4, 6] [3, 5, 7]
foo [1, 3, 5, 7, 8] [2, 4, 6, 8, 9]
我认为df.groupby('A').C.agg(list)
也应该有用。但显然它不会。
如果你想使用apply
,可以这样做,但你会松开列名:</ p>
In [35]:
print df.groupby('A').apply(lambda x: pd.Series(list(x.T.values)))
0 1 2
A
bar [bar, bar, bar] [2, 4, 6] [3, 5, 7]
foo [foo, foo, foo, foo, foo] [1, 3, 5, 7, 8] [2, 4, 6, 8, 9]
将结果转换为Series
至关重要,否则您将获得:
In [36]:
print df.groupby('A').apply(lambda x: list(x.T.values))
A
bar [[bar, bar, bar], [2, 4, 6], [3, 5, 7]]
foo [[foo, foo, foo, foo, foo], [1, 3, 5, 7, 8], [...
dtype: object
答案 1 :(得分:1)
一种简单的方法是
df = df.set_index('A')
a = df.groupby(level=0).apply(lambda x: x['C'].values)
a
现在看起来像
A
bar [2, 4, 6]
foo [1, 3, 5, 7, 8]
您可以通过
访问元素a['bar']
Out[235]: array([2, 4, 6])