是否可以在不先列出列表的情况下将 Series 附加到 DataFrame 行?

Posted

技术标签:

【中文标题】是否可以在不先列出列表的情况下将 Series 附加到 DataFrame 行?【英文标题】:Is it possible to append Series to rows of DataFrame without making a list first? 【发布时间】:2016-01-10 16:41:33 【问题描述】:

我有一些数据正在尝试组织到DataFrame 中的Pandas 中。我试图将每一行设为Series 并将其附加到DataFrame。我找到了一种方法,方法是将Series 附加到一个空的list,然后将Serieslist 转换为DataFrame

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

listDataFrame 的这一步似乎过分了。我在这里查看了一些示例,但没有一个Series 保留了来自SeriesIndex 标签以将它们用作列标签。

列是 id_names 而行是 type_names 的路很长:

是否可以在不先创建列表的情况下将 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()

空数据框

试过Insert a row to pandas dataframe 仍然得到一个空的数据框:/

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

【问题讨论】:

我正在尝试添加行。 Series 的索引应该是 DataFrame 的列。所以行是样本,列是特征。 您是否尝试按照错误消息的提示为系列添加名称? 您需要阅读错误信息。它告诉您为系列添加名称,或使用ignore_index=True。如果您执行其中任何一项,它都可以正常工作。 没有错误信息,它只是给了我一个空数据框 【参考方案1】:

也许更简单的方法是将pandas.Series 添加到pandas.DataFrame 中,并将ignore_index=True 参数添加到DataFrame.append()。示例 -

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)

要保留标签,您可以使用解决方案来包含系列名称,同时将附加的 DataFrame 分配回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()

【讨论】:

我在上面的“向熊猫数据框插入一行”链接中看到了这一点。我正试图弄乱它。也许有些事情我做得不对。 啊,谢谢!我没有抓住 DF = DF.append() 这与列表追加不同。对不起,我错过了。 我丢失了索引标签。有什么办法可以保存吗? 您可以将name 解决方案与DF = DF.append(SR_row) 一起使用。用那个例子更新了答案。 知道了!非常感谢@Anand S Kumar【参考方案2】:

DataFrame.append 不会就地修改 DataFrame。如果要将其重新分配回原始变量,则需要执行 df = df.append(...)

【讨论】:

这是与 python 正常行为的偏差,值得始终牢记。【参考方案3】:

这样的东西可以工作......

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

尝试使用此命令。请参见下面给出的示例:

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

df

【讨论】:

【参考方案6】:

这也可以:

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 在这种情况下是重要的标志。

【讨论】:

以上是关于是否可以在不先列出列表的情况下将 Series 附加到 DataFrame 行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不先定义表中的列的情况下将数据加载到 PostgreSQL 中?

如何在不先加载到 RAM 的情况下将文件加载到 blob 中?

如何在不安装的情况下列出python库的依赖项? [复制]

是否可以在不先阅读的情况下更改rails中的记录

在 PHP 中是不是可以在不先提取其内容的情况下检查 Zip 文件的内容?

是否可以在不存储卡的情况下将交易与客户联系起来?