首页 文章

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

提问于
浏览
0

情况:Pandas ' dataframe' s 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

    解决 . 如果我做了一个更全面的工作分析数据框,我可能已经注意到列名重复 .

    返回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'>
    

相关问题