Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在pandas中将长数据格式转换为宽数据格式_Python_Pandas_Formatting - Fatal编程技术网

Python 如何在pandas中将长数据格式转换为宽数据格式

Python 如何在pandas中将长数据格式转换为宽数据格式,python,pandas,formatting,Python,Pandas,Formatting,我有长格式的数据,并希望将其转换为具有稀疏数据的宽格式: df = pd.DataFrame({'id':[1000,1001,1000,1002,1003,1000], 'Date':[26018,26017,26016,26010,26009,26009]}) 并通过指定以下各项将其转换为宽格式: 思想是添加辅助列和旋转方式,添加缺少的值,最后将misng值转换为0,并转换为整数: df1 = (df.assign(new = 1)

我有长格式的数据,并希望将其转换为具有稀疏数据的宽格式:

df = pd.DataFrame({'id':[1000,1001,1000,1002,1003,1000],
                   'Date':[26018,26017,26016,26010,26009,26009]})

并通过指定以下各项将其转换为宽格式:


思想是添加辅助列和旋转方式,添加缺少的值,最后将misng值转换为
0
,并转换为整数:

df1 = (df.assign(new = 1)
         .pivot('id','Date','new')
         .reindex(range(df['Date'].min(), df['Date'].max() + 1), axis=1)
         .fillna(0)
         .astype(int))
print (df1)
Date  26009  26010  26011  26012  26013  26014  26015  26016  26017  26018
id                                                                        
1000      1      0      0      0      0      0      0      1      0      1
1001      0      0      0      0      0      0      0      0      1      0
1002      0      1      0      0      0      0      0      0      0      0
1003      1      0      0      0      0      0      0      0      0      0
如果获得:

ValueError:索引包含重复的条目,无法重塑

这意味着在更改的样本数据的最后一行中存在重复项。然后添加:


注意:我的解决方案不计算行数,仅返回
1
如果存在交点
id
Date
否则
0

如果您也在计算频率,则可以使用
交叉表

df1 = pd.crosstab(df['id'], df['Date']).reindex(range(df['Date'].min(), df['Date'].max() + 1), axis=1).fillna(0).astype(int) 
df1的输出:

Date  26009  26010  26011  26012  26013  26014  26015  26016  26017  26018
id                                                                        
1000      1      0      0      0      0      0      0      1      0      1
1001      0      0      0      0      0      0      0      0      1      0
1002      0      1      0      0      0      0      0      0      0      0
1003      1      0      0      0      0      0      0      0      0      0

您可以利用
groupby.size
unstack
。最后,
reindex
作为其他解决方案

ix = range(df.Date.min(), df.Date.max()+1)
df_final = (df.groupby(['id', 'Date']).size()
              .unstack(fill_value=0)
              .reindex(ix, axis=1, fill_value=0))

Out[205]:
Date  26009  26010  26011  26012  26013  26014  26015  26016  26017  26018
id
1000      1      0      0      0      0      0      0      1      0      1
1001      0      0      0      0      0      0      0      0      1      0
1002      0      1      0      0      0      0      0      0      0      0
1003      1      0      0      0      0      0      0      0      0      0

如果使用pivot_table()而不是pivot(),则重复项将被忽略,并且工作正常。不知道为什么@Mrutyunjaya-如果存在重复项,则其计数
表示
,如果所有
1
值的平均值均为
1
ix = range(df.Date.min(), df.Date.max()+1)
df_final = (df.groupby(['id', 'Date']).size()
              .unstack(fill_value=0)
              .reindex(ix, axis=1, fill_value=0))

Out[205]:
Date  26009  26010  26011  26012  26013  26014  26015  26016  26017  26018
id
1000      1      0      0      0      0      0      0      1      0      1
1001      0      0      0      0      0      0      0      0      1      0
1002      0      1      0      0      0      0      0      0      0      0
1003      1      0      0      0      0      0      0      0      0      0