将多个 int 列/行合并为一个 numpy 数组(熊猫数据框)
Posted
技术标签:
【中文标题】将多个 int 列/行合并为一个 numpy 数组(熊猫数据框)【英文标题】:Merge multiple int columns/rows into one numpy array (pandas dataframe) 【发布时间】:2019-07-04 12:19:39 【问题描述】:我有一个包含几列和几行的 pandas 数据框。我想将列合并为一个,然后将基于id
和date
的行合并为一个。
目前我正在这样做:
df['matrix'] = df[[col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15,col16,col17,col18,col19,col20,col21,col22,col23,col24,col25,col26,col27,col28,col29,col30,col31,col32,col33,col34,col35,col36,col37,col38,col39,col40,col41,col42,col43,col44,col45,col46,col47,col48]].values.tolist()
df = df.groupby(['id','date'])['matrix'].apply(list).reset_index(name='matrix')
这给了我list
形式的矩阵。
后来我把它转换成numpy.ndarray
使用:
df['matrix'] = df['matrix'].apply(np.array)
这是我数据集的一小部分供参考:
id,date,col0,col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15,col16,col17,col18,col19,col20,col21,col22,col23,col24,col25,col26,col27,col28,col29,col30,col31,col32,col33,col34,col35,col36,col37,col38,col39,col40,col41,col42,col43,col44,col45,col46,col47,col48
16,2014-06-22,0,0,0,10,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
16,2014-06-22,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
16,2014-06-22,2,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
16,2014-06-22,3,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0
16,2014-06-22,4,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0
虽然上述代码适用于小型数据集,但有时会在较大的数据集上崩溃。特别是df['matrix'].apply(np.array)
声明。
有没有一种方法可以让我执行合并以获取numpy.array
?这样可以节省很多时间。
【问题讨论】:
你最终拥有 2 个Series.apply
。您可能只需 df[[f'coli'for i in range(0,48)]].groupby([df.id, df.date]).apply(np.array)
就可以减少一切
@ALollz df['matrix'].apply(np.array)
语句使系统崩溃。因此,我想要一个替代品。即使在 for 循环中使用它也无济于事。不管怎样,我也会试试这个。
@ALollz 请验证代码语句的语法,它给了我错误
什么版本的python?
@ALollz Python 3.6.7
【参考方案1】:
一开始不需要合并列。使用 groupby 拆分 DataFrame,然后将结果展平
matrix=df.set_index(['id','date']).groupby(['id','date']).apply(lambda x: x.values.flatten())
【讨论】:
以上是关于将多个 int 列/行合并为一个 numpy 数组(熊猫数据框)的主要内容,如果未能解决你的问题,请参考以下文章
如何将 int numpy 数组的列乘以浮点数并保持在 int 中?