我有一个名为df的Pandas DataFrame,如下所示:
Date String
2016-08-01 a
2016-08-01 b
2016-08-01 c
2016-06-30 d
2016-06-30 e
2016-06-30 f
我正在尝试获得:
Date Column1 Column2 Column3
2016-08-01 a b c
2016-06-30 d e f
我尝试使用:
df = pd.pivot_table(df, index='Date')
或:
df.pivot_table(index=['Date'], values="News")
但我一直收到:
pandas.core.base.DataError:没有要聚合的数字类型
我该怎么办?
答案 0 :(得分:7)
使用groupby
和cumcount
获取日期的重复计数,然后使用pivot
:
(df.assign(Count=df.groupby('Date').cumcount()+1)
.pivot('Date', 'Count', 'String')
.add_prefix('Column'))
Count Column1 Column2 Column3
Date
2016-06-30 d e f
2016-08-01 a b c
或者,set_index
和unstack
:
(df.set_index(['Date', df.groupby('Date').cumcount()+1])['String']
.unstack()
.add_prefix('Column'))
Column1 Column2 Column3
Date
2016-06-30 d e f
2016-08-01 a b c
答案 1 :(得分:1)
另一种方法是使用groupy
,apply(list)
,然后使用Series.values.tolist()
将列表值转换为单独的列
# Groupby and get the values in a list per unique value of the Date column
df = df.groupby('Date').String.apply(list).reset_index()
Date String
0 2016-06-30 [d, e, f]
1 2016-08-01 [a, b, c]
# Convert the values from the list to seperate columns and after that drop the String column
df[['Column1', 'Column2', 'Column3']] = pd.DataFrame(df.String.values.tolist(), index=df.index)
df.drop('String', axis=1, inplace=True)
Date Column1 Column2 Column3
0 2016-06-30 d e f
1 2016-08-01 a b c