嘿,我有这样的数据
[ID] [DATE] [STOCK]
1 1/1/1 123
1 1/2/1 125
2 1/2/1 223
1 2/2/1 234
1 1/1/1 R123
我已对带有日期的 ID 应用了交叉选项卡并得到了此信息:-
train_ = pd.crosstab(train.ID, train.DATE)
[ID] [1/1/1] [1/2/1] [2/2/1]
1 1 1 1
2 0 1 0
我希望输出是这样的
[ID] [1/1/1] [1/2/1] [2/2/1]
1 [123,R123] [125] [234]
2 [] [223] []
最佳答案
您需要使用pivot
或set_index
+ unstack
reshape :
df1 = df.pivot(index='ID', columns='DATE', values='STOCK')
print (df1)
DATE 1/1/1 1/2/1 2/2/1
ID
1 123.0 125.0 234.0
2 NaN 223.0 NaN
df1 = df.set_index(['ID','DATE'])['STOCK'].unstack()
print (df1)
DATE 1/1/1 1/2/1 2/2/1
ID
1 123.0 125.0 234.0
2 NaN 223.0 NaN
如果创建新索引和列中的列中有重复项:
print (df)
ID DATE STOCK
0 1 1/1/1 123.0<-same ID=1, DATE=1/1/1
1 1 1/1/1 200.0<-same ID=1, DATE=1/1/1
2 1 1/2/1 125.0
3 2 1/2/1 223.0
4 1 2/2/1 234.0
...然后需要 groupby
+ 申请
+ unstack
:
df1 = df.groupby(['ID','DATE'])['STOCK'].apply(list).unstack()
print (df1)
DATE 1/1/1 1/2/1 2/2/1
ID
1 [123.0, 200.0] [125.0] [234.0]
2 None [223.0] None
将 None
替换为 空列表
并不那么容易:
a = [[[] for x in range(len(df1.columns))] for y in range(len(df1.index))]
df2 = pd.DataFrame(a, index=df1.index, columns=df1.columns)
df1 = df1.fillna(df2)
print (df1)
DATE 1/1/1 1/2/1 2/2/1
ID
1 [123.0, 200.0] [125.0] [234.0]
2 [] [223.0] []
关于python - 如何使用交叉表显示频率列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45252108/