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

Pandas iterrows() row.get() method returning series instead of cell value

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

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

细节:在第一个环境中,我通过pandas的iterrows()方法迭代行。在每一行中,我访问一个给定的属性,如下所示:

1
2
3
4
5
6
print(type(row)) # pandas.series.Series

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

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

现在,当我再次运行时,在第二个环境中,EDCOX1×0操作返回EDCOX1×5×变量。它似乎正常,但得到(EDOCX1,1),每个元素的行为不同于以前。具体地说,返回值不是int、浮点、STR等,而是本身的一系列,索引保持不变,这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
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

最后的想法:我似乎记得在某个时刻,您可以配置panda以返回具有行值的索引,但也许我在想象事情。

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


断然的。如果我对数据帧进行更彻底的分析,我可能会注意到列名重复。

返回序列而不是单个值的原因是,通过上游很远的.rename()操作,有两列具有相同的名称。因此,当请求该列值时,pandas的行为(应该)和返回都是一个系列。

下面是一个独立的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
>>> 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'>