我正在循环解析数据,一旦对其进行了解析和结构化,我想将其添加到数据帧中。
我想要的数据帧的结束格式如下:
df:
id 2018-01 2018-02 2018-03
234 2 1 3
345 4 5 1
534 5 3 4
234 2 2 3
当我遍历循环中的数据时,我有一个字典,其中包含id,月份和月份值,例如:
{'id':234,'2018-01':2}
{'id':534,'2018-01':5}
{'id':534,'2018-03':4}
.
.
.
获取空数据框并向其循环添加行和列及其值的最佳方法是什么?
基本上,在我进行迭代时,它看起来像这样
df:
id 2018-01
234 2
然后
df:
id 2018-01
234 2
534 5
然后
df:
id 2018-01 2018-03
234 2
534 5 4
以此类推...
答案 0 :(得分:0)
IIUC,您需要首先将单个字典转换为数据帧,然后执行append
,如果我们没有重复的'id'
,则需要groupby
获得{{1} }值
first
答案 1 :(得分:0)
不建议在每次迭代时都生成一个新的数据帧并将其追加,这非常昂贵。如果您的数据不太大且无法容纳到内存中,则可以先列出字典,然后用pandas进行操作:
df = pd.DataFrame(your_list_of_dicts)
df.set_index('id')
如果创建列表非常昂贵(因为您想为数据框节省内存),请考虑使用生成器而不是列表。生成器功能的基本结构是:
def datagen(your_input):
for item in your_input:
# your code to make a dict
yield dict
生成器对象data = datagen(input)
将不存储字典,但会在每次迭代时生成一个字典。它可以按需生成项目。当您执行pd.DataFrame(data)
时,熊猫将流式传输所有数据并构成一个数据帧。生成器可用于数据管道(如UNIX中的管道),并且对于大数据工作流非常强大。但是请注意,生成器对象只能使用一次,也就是说,如果再次运行pd.DataFrame(data),则会得到一个空的数据帧。
答案 2 :(得分:0)
我在 Pandas 中找到的将新数据行迭代地附加到数据帧的最简单方法(虽然不直观)是使用 df.loc[ ]
来引用最后(不存在的)行,使用 len(df)
作为索引:
df.loc[ len(df) ] = [new, row, of, data]
这会将新数据行就地“追加”到数据帧的末尾。
上面的例子是一个正好有 4 列的空 Dataframe,例如:
df = pandas.DataFrame( columns=["col1", "col2", "col3", "col4"] )
df.loc[ ]
索引可以在任何行插入数据,无论它是否存在。似乎它永远不会给出 IndexError
,就像 numpy.array 或 List 如果您试图分配给不存在的行一样。
对于全新的空 DataFrame,len(df)
返回 0
,因此引用第一个空白行,然后每次添加一行时增加一。
–––––
我不知道这种方法的速度/内存效率成本,但它适用于我适度的数据集(几千行)。至少从内存的角度来看,我认为将数据直接附加到目标 DataFrame 的大循环将比首先生成重复数据的中间列表,然后从该列表生成 DataFrame 使用更少的内存。时间“效率”可能是一个完全不同的问题,其他 SO 专家可以评论。
–––––
但是,对于 OP 的特定情况,如果数据用于现有的同名列,您还请求组合 columns
,则在 {{ 1}} 循环。
相反,我会将 DataFrame 设为“哑巴”并按原样导入数据,并在日期到来时重复它们,例如。你的循环后数据帧看起来像这样,用简单的列名描述原始数据:
for
(同一日期有两个条目)。
然后我将使用 DataFrame 的数据库函数来组织您喜欢的数据,可能使用 df:
id date data
234 2018-01 2
534 2018-01 5
535 2018-03 4
和 df.unique()
的某种组合。稍后会详细研究。