Pandas:在数据框中追加一行并指定其索引标签

Ame*_*ina 55 python pandas

在将行追加到数据帧时,有没有办法为新行指定我想要的索引?

原始文档提供以下示例:

In [1301]: df = DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])

In [1302]: df
Out[1302]: 
          A         B         C         D
0 -1.137707 -0.891060 -0.693921  1.613616
1  0.464000  0.227371 -0.496922  0.306389
2 -2.290613 -1.134623 -1.561819 -0.260838
3  0.281957  1.523962 -0.902937  0.068159
4 -0.057873 -0.368204 -1.144073  0.861209
5  0.800193  0.782098 -1.069094 -1.099248
6  0.255269  0.009750  0.661084  0.379319
7 -0.008434  1.952541 -1.056652  0.533946

In [1303]: s = df.xs(3)

In [1304]: df.append(s, ignore_index=True)
Out[1304]: 
          A         B         C         D
0 -1.137707 -0.891060 -0.693921  1.613616
1  0.464000  0.227371 -0.496922  0.306389
2 -2.290613 -1.134623 -1.561819 -0.260838
3  0.281957  1.523962 -0.902937  0.068159
4 -0.057873 -0.368204 -1.144073  0.861209
5  0.800193  0.782098 -1.069094 -1.099248
6  0.255269  0.009750  0.661084  0.379319
7 -0.008434  1.952541 -1.056652  0.533946
8  0.281957  1.523962 -0.902937  0.068159
Run Code Online (Sandbox Code Playgroud)

新行自动获取索引标签的位置.有没有办法控制新标签?

unu*_*tbu 47

name系列的成为index在数据帧的行:

In [99]: df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])

In [100]: s = df.xs(3)

In [101]: s.name = 10

In [102]: df.append(s)
Out[102]: 
           A         B         C         D
0  -2.083321 -0.153749  0.174436  1.081056
1  -1.026692  1.495850 -0.025245 -0.171046
2   0.072272  1.218376  1.433281  0.747815
3  -0.940552  0.853073 -0.134842 -0.277135
4   0.478302 -0.599752 -0.080577  0.468618
5   2.609004 -1.679299 -1.593016  1.172298
6  -0.201605  0.406925  1.983177  0.012030
7   1.158530 -2.240124  0.851323 -0.240378
10 -0.940552  0.853073 -0.134842 -0.277135
Run Code Online (Sandbox Code Playgroud)

  • 它返回一个副本.您可以通过执行`df2 = df.append(s)`,然后执行`df2.ix [0,'A'] = 1000`然后检查`df`是否已更改来判断.(它没有.) (6认同)
  • @gseattle df.xs(row_name)将行值复制到新系列中 (2认同)

Alo*_*lon 27

df.loc将完成这项工作:

>>> df = pd.DataFrame(np.random.randn(3, 2), columns=['A','B'])
>>> df
          A         B
0 -0.269036  0.534991
1  0.069915 -1.173594
2 -1.177792  0.018381
>>> df.loc[13] = df.loc[1]
>>> df
           A         B
0  -0.269036  0.534991
1   0.069915 -1.173594
2  -1.177792  0.018381
13  0.069915 -1.173594
Run Code Online (Sandbox Code Playgroud)

  • 我没有收到(任何)警告:pandas 版本 0.22.0 (python 2.7.6) (2认同)

Har*_*hit 9

我将参考问题中公布的相同数据样本:

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
print('The original data frame is: \n{}'.format(df))
Run Code Online (Sandbox Code Playgroud)

运行此代码将为您提供帮助

The original data frame is:

          A         B         C         D
0  0.494824 -0.328480  0.818117  0.100290
1  0.239037  0.954912 -0.186825 -0.651935
2 -1.818285 -0.158856  0.359811 -0.345560
3 -0.070814 -0.394711  0.081697 -1.178845
4 -1.638063  1.498027 -0.609325  0.882594
5 -0.510217  0.500475  1.039466  0.187076
6  1.116529  0.912380  0.869323  0.119459
7 -1.046507  0.507299 -0.373432 -1.024795
Run Code Online (Sandbox Code Playgroud)

现在,您希望向此数据框追加一个新行,该行不需要复制数据框中的任何其他行.@Alon建议使用一种有趣的方法来df.loc追加一个具有不同索引的新行.但是,使用这种方法的问题是,如果该索引上已存在一行,则它将被新值覆盖.当行索引不唯一时,数据集通常就是这种情况,例如事务数据集中的商店ID.因此,对您的问题更通用的解决方案是创建行,将新行数据转换为pandas系列,将其命名为您想要的索引,然后将其附加到数据框.不要忘记用附加行覆盖原始数据框.原因是df.append返回数据帧的视图,而不是修改其内容.以下是代码:

row = pd.Series({'A':10,'B':20,'C':30,'D':40},name=3)
df = df.append(row)
print('The new data frame is: \n{}'.format(df))
Run Code Online (Sandbox Code Playgroud)

以下是新的输出:

The new data frame is:

           A          B          C          D
0   0.494824  -0.328480   0.818117   0.100290
1   0.239037   0.954912  -0.186825  -0.651935
2  -1.818285  -0.158856   0.359811  -0.345560
3  -0.070814  -0.394711   0.081697  -1.178845
4  -1.638063   1.498027  -0.609325   0.882594
5  -0.510217   0.500475   1.039466   0.187076
6   1.116529   0.912380   0.869323   0.119459
7  -1.046507   0.507299  -0.373432  -1.024795
3  10.000000  20.000000  30.000000  40.000000
Run Code Online (Sandbox Code Playgroud)


tre*_*159 7

还有另一种解决方案。下一个代码很糟糕(尽管我认为 pandas 需要这个功能):

import pandas as pd

# empty dataframe
a = pd.DataFrame()
a.loc[0] = {'first': 111, 'second': 222}
Run Code Online (Sandbox Code Playgroud)

但接下来的代码运行良好:

import pandas as pd

# empty dataframe
a = pd.DataFrame()
a = a.append(pd.Series({'first': 111, 'second': 222}, name=0))
Run Code Online (Sandbox Code Playgroud)