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 一次创建多行的主要内容,如果未能解决你的问题,请参考以下文章

pandas 数据框:loc 与查询性能

Python pandas 数据框警告,建议改用 .loc 吗?

求教pandas的dataframe索引值只有一行,用loc如何不返回series

使用 loc 更新数据框 python pandas

使用 .loc() 时的 Pandas KeyError [重复]

向熊猫数据框添加背景色