不使用列表,能否将Series附加到DataFrame的行中?

75

我有一些数据,想要用Pandas将其组织成DataFrame。我试图使每一行都成为一个Series,然后将其附加到DataFrame中。我找到了一种方法,即将Series附加到一个空的list中,然后将list中的Series转换为DataFrame

例如:DF = DataFrame([series1,series2],columns=series1.index)

这个从listDataFrame的步骤似乎有点繁琐。我查看了一些例子,但是没有一种Series能够保留SeriesIndex标签并将它们用作列标签。

我的做法是,其中列是id_names,行是type_names: enter image description here

是否有可能在不先制作列表的情况下将Series附加到DataFrame的行中?

#!/usr/bin/python

DF = DataFrame()
for sample,data in D_sample_data.items():
    SR_row = pd.Series(data.D_key_value)
    DF.append(SR_row)
DF.head()

TypeError: Can only append a Series if ignore_index=True or if the Series has a name

然后我尝试了

DF = DataFrame()
for sample,data in D_sample_data.items():
    SR_row = pd.Series(data.D_key_value,name=sample)
    DF.append(SR_row)
DF.head()

空的数据框架

尝试在 Pandas 数据框中插入一行,但仍然得到一个空数据框 :/

我想让 Series 成为行,其中 Series 的索引成为 DataFrame 的列标签


我正在尝试添加行。Series的索引应该是DataFrame的列。因此,行将是样本,列将是特征。 - O.rka
你尝试给系列添加一个名称吗?就像错误信息所建议的那样。 - BrenBarn
你需要阅读错误信息。它告诉你要添加一个Series的名称,或者使用ignore_index=True。如果你做了其中任何一个,它就可以正常工作。 - BrenBarn
没有错误信息,它只是给了我一个空的数据框。 - O.rka
7个回答

97

也许更简单的方法是将 pandas.Series 使用 DataFrame.append() 函数并加上 ignore_index=True 参数添加到 pandas.DataFrame 中。示例代码如下 -

DF = DataFrame()
for sample,data in D_sample_data.items():
    SR_row = pd.Series(data.D_key_value)
    DF = DF.append(SR_row,ignore_index=True)

演示 -

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([[1,2],[3,4]],columns=['A','B'])

In [3]: df
Out[3]:
   A  B
0  1  2
1  3  4

In [5]: s = pd.Series([5,6],index=['A','B'])

In [6]: s
Out[6]:
A    5
B    6
dtype: int64

In [36]: df.append(s,ignore_index=True)
Out[36]:
   A  B
0  1  2
1  3  4
2  5  6
你的代码中另一个问题是 DataFrame.append() 不是原地操作,它返回添加后的数据帧,你需要将其赋回到原始数据帧才能起作用。示例 -
DF = DF.append(SR_row,ignore_index=True)
为了保留标签,您可以使用您的解决方案将系列名称包含在与将附加的数据帧分配回 DF 相同的名称中。示例 -
DF = DataFrame()
for sample,data in D_sample_data.items():
    SR_row = pd.Series(data.D_key_value,name=sample)
    DF = DF.append(SR_row)
DF.head()

我看到了上面“在pandas dataframe中插入一行”的链接。我正在尝试着去操作它。也许有些地方我做得不正确。 - O.rka
7
谢谢!我没有注意到 DF = DF.append(),这与列表添加非常不同。很抱歉我错过了那个。 - O.rka
我丢失了索引标签。有没有办法保留它们? - O.rka
2
你可以使用 DF = DF.append(SR_row) 将你的 name 解决方案更新。已经用这个例子更新了答案。 - Anand S Kumar
6
警告:df.append现已弃用,您应该尝试使用pd.concat代替。 - David Davó

30

DataFrame.append不会在原DataFrame中进行修改。如果想要重新分配回原变量,您需要执行df = df.append(...)


2
这是Python正常行为的偏差,值得始终牢记。 - Adnan Y
1
使用 df.append 已自 pandas 1.4 起被弃用,并应该替换为 pd.concat - ascripter

13

像这样的东西可能会有用...

mydf.loc['newindex'] = myseries

这里是我使用它的一个例子...

stats = df[['bp_prob', 'ICD9_prob', 'meds_prob', 'regex_prob']].describe()

stats
Out[32]: 
          bp_prob   ICD9_prob   meds_prob  regex_prob
count  171.000000  171.000000  171.000000  171.000000
mean     0.179946    0.059071    0.067020    0.126812
std      0.271546    0.142681    0.152560    0.207014
min      0.000000    0.000000    0.000000    0.000000
25%      0.000000    0.000000    0.000000    0.000000
50%      0.000000    0.000000    0.000000    0.013116
75%      0.309019    0.065248    0.066667    0.192954
max      1.000000    1.000000    1.000000    1.000000

medians = df[['bp_prob', 'ICD9_prob', 'meds_prob', 'regex_prob']].median()

stats.loc['median'] = medians

stats
Out[36]: 
           bp_prob   ICD9_prob   meds_prob  regex_prob
count   171.000000  171.000000  171.000000  171.000000
mean      0.179946    0.059071    0.067020    0.126812
std       0.271546    0.142681    0.152560    0.207014
min       0.000000    0.000000    0.000000    0.000000
25%       0.000000    0.000000    0.000000    0.000000
50%       0.000000    0.000000    0.000000    0.013116
75%       0.309019    0.065248    0.066667    0.192954
max       1.000000    1.000000    1.000000    1.000000
median    0.000000    0.000000    0.000000    0.013116

12

append已弃用,最好的选择是使用to_frame().T。

df1 = pd.DataFrame({'name':['john','mark'],'job':['manager','salesman'],'age':[43,23]})
ser1 = df1.iloc[-1]
pd.concat([df1,ser1.to_frame().T],ignore_index=True)

   name       job age
0  john   manager  43
1  mark  salesman  23
2  mark  salesman  23

10

将系列转换为数据框并转置,然后正常追加。

srs = srs.to_frame().T
df = df.append(srs)

4
尝试使用此命令。请参考下面的示例:

Before image

df.loc[len(df)] = ['Product 9',99,9.99,8.88,1.11]

df

After Image


1
这也可以工作:

df = pd.DataFrame()
new_line = pd.Series({'A2M': 4.059, 'A2ML1': 4.28}, name='HCC1419')
df = df.append(new_line, ignore_index=False)

在数据框中,系列中的name将成为索引。在这种情况下,ignore_index=False是一个重要的标志。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接