Pandas dataframe 通过 .loc 同时创建多行
Pandas dataframe creating multiple rows at once via .loc
我可以使用 .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
最后两行是新添加的。
示例数据
>>> 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
诚然,这是一个很晚的答案,但我不得不处理类似的问题,并且认为我的解决方案也可能对其他人有所帮助。
重新创建数据后,基本上分为两步:
重新创建数据:
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
我可以使用 .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
最后两行是新添加的。
示例数据
>>> 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
诚然,这是一个很晚的答案,但我不得不处理类似的问题,并且认为我的解决方案也可能对其他人有所帮助。
重新创建数据后,基本上分为两步:
重新创建数据:
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