情况:熊猫'数据帧的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
都会产生相同的结果,就像记录每个列类型,行类型等一样。也就是说,我可以断言行类型是相同的,列类型在父数据框内是相同的,每个行元素的类型是相同的。
答案 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'>