Pandas 数据框通过 .loc 一次创建多行
Posted
技术标签:
【中文标题】Pandas 数据框通过 .loc 一次创建多行【英文标题】:Pandas dataframe creating multiple rows at once via .loc 【发布时间】:2017-10-17 16:49:43 【问题描述】:我可以使用.loc()
在数据框中创建一个新行:
>>> df = pd.DataFrame('a':[10, 20], 'b':[100,200], index='1 2'.split())
>>> df
a b
1 10 100
2 20 200
>>> df.loc[3, 'a'] = 30
>>> df
a b
1 10.0 100.0
2 20.0 200.0
3 30.0 NaN
但是如何使用相同的方法创建多行呢?
>>> df.loc[[4, 5], 'a'] = [40, 50]
...
KeyError: '[4 5] not in index'
我熟悉 .append() 但我正在寻找一种不需要在将新行附加到 df
之前将其构造到系列中的方法。
所需输入:
>>> df.loc[[4, 5], 'a'] = [40, 50]
期望的输出
a b
1 10.0 100.0
2 20.0 200.0
3 30.0 NaN
4 40.0 NaN
5 50.0 NaN
最后两行是新添加的。
【问题讨论】:
一次做多行是什么意思?你能举一个输入数据和期望输出的例子吗? @Allen,用所需的输入/输出更新了问题。 【参考方案1】:示例数据
>>> data = pd.DataFrame(
'a': [10, 6, -3, -2, 4, 12, 3, 3],
'b': [6, -3, 6, 12, 8, 11, -5, -5],
'id': [1, 1, 1, 1, 6, 2, 2, 4])
案例 1 请注意,range
可以更改为您想要的任何内容。
>>> for i in range(10):
... data.loc[i, 'a'] = 30
...
>>> data
a b id
0 30.0 6.0 1.0
1 30.0 -3.0 1.0
2 30.0 6.0 1.0
3 30.0 12.0 1.0
4 30.0 8.0 6.0
5 30.0 11.0 2.0
6 30.0 -5.0 2.0
7 30.0 -5.0 4.0
8 30.0 NaN NaN
9 30.0 NaN NaN
案例 2 在这里,我们向一个开始有 8 行的数据框添加一个新列。当我们将新列 c
扩展为长度为 10 时,其他列将扩展为 NaN
。
>>> for i in range(10):
... data.loc[i, 'c'] = 30
...
>>> data
a b id c
0 10.0 6.0 1.0 30.0
1 6.0 -3.0 1.0 30.0
2 -3.0 6.0 1.0 30.0
3 -2.0 12.0 1.0 30.0
4 4.0 8.0 6.0 30.0
5 12.0 11.0 2.0 30.0
6 3.0 -5.0 2.0 30.0
7 3.0 -5.0 4.0 30.0
8 NaN NaN NaN 30.0
9 NaN NaN NaN 30.0
【讨论】:
我忘了提到循环是一个显而易见的选择,但效率非常低。我正在寻找方法来利用 Pandas 对矩阵/数据帧进行操作的能力,而无需一次通过一行。【参考方案2】:诚然,这是一个很晚的答案,但我不得不处理类似的问题,并认为我的解决方案也可能对其他人有所帮助。
重新创建数据后,基本上是一个两步的方法:
重新创建数据:
import pandas as pd
df = pd.DataFrame('a':[10, 20], 'b':[100,200], index='1 2'.split())
df.loc[3, 'a'] = 30
使用.reindex
扩展df.index
:
idx = list(df.index)
new_rows = list(map(str, range(4, 6))) # easier extensible than new_rows = ["4", "5"]
idx.extend(new_rows)
df = df.reindex(index=idx)
使用.loc
设置值:
df.loc[new_rows, "a"] = [40, 50]
给你
>>> df
a b
1 10.0 100.0
2 20.0 200.0
3 30.0 NaN
4 40.0 NaN
5 50.0 NaN
【讨论】:
那么,有没有办法一口气搞定?以上是关于Pandas 数据框通过 .loc 一次创建多行的主要内容,如果未能解决你的问题,请参考以下文章
Python pandas 数据框警告,建议改用 .loc 吗?
求教pandas的dataframe索引值只有一行,用loc如何不返回series