我在一个类中有一个循环结构,它从另一个类中的数据帧检索行。这些行被逐一检索,这意味着它们作为一个系列返回。然后,我对系列执行多项操作,然后使用更改更新原始数据帧行。
所有这些在 99% 的情况下都可以正常工作,但在极少数情况下,我得到的不是一个系列,而是一个数据帧。这对我来说毫无意义,因为没有重复项,所以我每次都应该得到一个系列返回给我。这基本上就是我正在做的事情:
class XYZ:
state_df = #create dataframe and populate it
def __init__(self):
pass
def get_state(self, rowname):
return self.state_df.loc[rowname].copy()
def update_state(self, new_symbol_state):
self.state_df.loc[new_symbol_state.name] = new_symbol_state
class ABC:
def __init__(self):
pass
def process():
xyz = MyClass.XYZ()
state_series = xyz.get_state(rowname)
# do stuff with the dataframe row which should be a series
# ie: state_series. Then update the original dataframe row
xyz.update_state(state_series)
就像我说的,99% 的情况下,我都会收到返回给我的系列,我会对它执行一些操作,然后将其发送回原始数据帧,一切都很好。然而,我时不时地得到一个数据框而不是一个毫无意义的系列。即使我打印出数据框,它也显示它只有一行(即:没有重复项),因此它应该是一个系列?
我需要一种方法来确保在调用 state_series = xyz.get_state(rowname)
时始终获得返回给我的 Series。有没有办法确保我总能收到系列作品?或者至少如果我返回的数据帧只有 1 行,那么我如何将其更改为系列。
最佳答案
如果 rowname 是一个 list ,而不是单个元素,
df.loc[rowname]
将返回一个 DataFrame 。示例-
In [14]: df
Out[14]:
A B
0 1 3
1 2 4
2 3 5
3 4 5
In [15]: df.loc[0]
Out[15]:
A 1
B 3
Name: 0, dtype: int64
In [16]: type(df.loc[0])
Out[16]: pandas.core.series.Series
In [17]: df.loc[[0]]
Out[17]:
A B
0 1 3
In [18]: type(df.loc[[0]])
Out[18]: pandas.core.frame.DataFrame
因为,我们无法看到 rowname
来自哪里,我猜这可能是问题所在,您可以检查一下,为什么有时 rowname
会作为列表出现,而不是单个值。
关于python - 有时会返回一个数据框而不是一个系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32176542/