Pandas Dataframe 通过.loc一次创建多行

wlzqhblo  于 2022-12-16  发布在  其他
关注(0)|答案(3)|浏览(166)

我可以使用.loc()在 Dataframe 中创建一个新行:

>>> 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之前将其构造到Series中。
所需输入:

>>> 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

其中最后2行是新添加的。

biswetbf

biswetbf1#

诚然,这是一个很晚的答案,但我不得不处理一个类似的问题,并认为我的解决方案可能对其他人也有帮助。
重新创建数据后,基本上分为两步:
1.重新创建数据:

import pandas as pd
df = pd.DataFrame({'a':[10, 20], 'b':[100,200]}, index='1 2'.split())
df.loc[3, 'a'] = 30

1.使用.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)

1.使用.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
nkkqxpd9

nkkqxpd92#

示例数据

>>> 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
zujrkrfu

zujrkrfu3#

虽然有点晚,但我的解决方案与公认的解决方案相似:

import pandas as pd
df = pd.DataFrame({'a':[10, 20], 'b':[100,200]}, index=[1,2])

# single index assignment always works
df.loc[3, 'a'] = 30

# multiple indices
new_rows = [4,5]

# there should be a nicer way to add more than one index/row at once,
# but at least this is just one extra line:
df = df.reindex(index=df.index.append(pd.Index(new_rows))) # note: Index.append() doesn't accept non-Index iterables?

# multiple new rows now works:
df.loc[new_rows, "a"] = [40, 50]
print(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

现在也可以这样做(当聚合 Dataframe 的性能很重要时很有用):
一个二个一个一个

相关问题