python - 如何使用交叉表显示频率列表?

标签 python pandas crosstab

嘿,我有这样的数据

[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] []

最佳答案

您需要使用pivotset_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/

相关文章:

python - 输入是否为回文

python - 添加 pandas 数据框中的所有行

sql - 将一些行更改为列

postgresql - postgres 交叉表查询中的动态列名

sql - PostgreSQL 按月和类型分组数据

python - 如何使其更具 Python 风格或 future 更具可读性?

python - 如何在 Django 中使用 AJAX 正确从 html 调用函数/url?

python - Python-OpenCV清除模糊的图像

python - 如何在 Pandas 的字符串末尾添加特定数量的字符?

python - Pandas sklearn one-hot 编码数据帧还是 numpy?