【发布时间】:2017-02-18 21:10:28
【问题描述】:
我认为通过使用庞大的 pandas.DataFrame 库,应该非常直接地完成所有可以使用 SQL 表执行的标准操作。但在研究了许多选项后,我仍然没有找到一个好的工作解决方案.
要求:
- 具有 4 列不同数据类型(uint32、字符串、...)的表,其中 3 列应用作索引
- 许多 (>10k) int8 类型的附加列
- 最初我有动态添加行和列的想法,但结果非常慢(使用 df.at[row, col] = y)
- 我最终创建了一个包含不同类型的几列的 DataFrame,并将其与另一个大型 DataFrame 连接,该 DataFrame 由 uint8 类型的元素的 numpy 数组创建
-
...看起来不错,但现在无法使用索引访问、添加或设置数组元素
import numpy as np import pandas as pd # create DataFrame idx_names = ['A','B','C'] col_names = ['y'] df = pd.DataFrame(columns = idx_names + col_names) # create DataFrame from numpy array npa = np.zeros((5,10),dtype=np.uint8) dfa = pd.DataFrame(npa) # add DataFrames column-wise t = pd.concat([df,dfa], axis=1) # set index columns t.set_index(idx_names,inplace=True)
y 0 1 2 3 4 5 6 7 8 9
A B C
NaN NaN NaN NaN 0 0 0 0 0 0 0 0 0 0
NaN NaN 0 0 0 0 0 0 0 0 0 0
NaN NaN 0 0 0 0 0 0 0 0 0 0
NaN NaN 0 0 0 0 0 0 0 0 0 0
NaN NaN 0 0 0 0 0 0 0 0 0 0
现在我想通过提供索引来设置列 (y,0, ...9) 中的值。 如果索引尚不可用,则应将其添加到表中。
t( (t['A']='US',t['B']='CA',t['C']='SFO') , 'y') = "IT"
t( (t['A']='US',t['B']='CA',t['C']='LA' ) , '1') = 255
【问题讨论】:
-
你能说得更具体点吗?与实际发生的情况相比,您期望发生什么?你有任何错误吗?你最后的问题是什么
-
如果您有新问题,请提出新问题...
-
试试这个:
t.loc[('US','CA','SFO'), 'y'] = 'IT' -
剩下的问题是(这就是为什么我想出首先创建一个 numpy 数组的想法)a)新行和列包含 NaN,所以我不能通过 += 增加值1(没有冗长的“if NaN then .. else ...”(出于性能原因我想避免)b)我丢失了数据元素的类型,它们不再是 uint8 (..我有数百万他们)
-
如果我再次使用(请参阅初始问题)“t = pd.concat([df,dfa], axis=1)" 然后保持零和 uint8 类型,但我使用相同的代码get " raise KeyError('%s not in index' % objarr[mask]) KeyError: "['US','CA','SFO'] not in index"
标签: python pandas dataframe types multi-index