Pandas iterrows()row.get()方法返回系列而不是单元格值

时间:2017-06-13 22:46:52

标签: python pandas

情况:熊猫'数据帧的iterrows()行在两个不同的环境中表现不同。在一个中,row.get()按预期返回一个值,在另一个row.get()本身返回一个系列 - 这是意外的。

问题:是否有pandas设置/某些配置可能导致以下行为在两种环境之间有所不同?我承认并非此示例中存在所有信息。我希望可能的是,显示以下行为,有人可能会认识到这是一些常见模式的结果,或者可能是设置更改。

详细说明: 在第一个环境中,我通过Pandas'来迭代行。 iterrows()方法。在每一行中,我都访问一个给定的属性,如下所示:

print(type(row)) # pandas.series.Series

foo_val = row.get('foo', default=None)

print(type(foo_val)) # float
print(foo_val) # 234.23

现在当我再次跑步时,在第二个环境中; iterrows()操作返回row变量。看起来很正常但是获得(row.get())每个元素的行为与以前不同。具体来说,返回值不会是int,float,str等,而是本身就是一个系列,保留了索引,这样:

print(type(row)) # pandas.series.Series

foo_val = row.get('foo', default=None)

print(type(foo_val)) # pandas.series.Series
print(foo_val) 
# foo      234.23
# Name: 0, dtype: object

foo_val_v2 = foo_val.get('foo', default=None)

print(type(foo_val_v2)) # float
print(foo_val_v2) # 234.23

最后的想法: 我似乎在某种程度上回想起你能够配置pandas以返回带有行值的索引,但也许我想象的东西。

我还应该注意,在两种情况下打印row都会产生相同的结果,就像记录每个列类型,行类型等一样。也就是说,我可以断言行类型是相同的,列类型在父数据框内是相同的,每个行元素的类型是相同的。

1 个答案:

答案 0 :(得分:1)

解决。如果我对数据框进行了更全面的分析,我可能已经注意到列名称重复。

返回Series而不是单个值的原因是因为通过远上游的.rename()操作,有两个具有相同名称的列。因此,当请求该列值时,Pandas表现出(应该如此)并作为系列返回。

以下是一个独立的示例。

>>> df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})

>>> df.rename(columns={'B': 'A'})
   A  A
0  1  4
1  2  5
2  3  6

>>> df['A']
0    1
1    2
2    3
Name: A, dtype: int64

>>> type(df['A'])
<class 'pandas.core.series.Series'>

>>> df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})

>>> df = df.rename(columns={'B': 'A'})

>>> df['A']
   A  A
0  1  4
1  2  5
2  3  6

>>> type(df['A'])
<class 'pandas.core.frame.DataFrame'>