我在一个类中有一个循环结构,它从另一个类中的数据帧中检索行。逐行检索行,这意味着它们作为系列返回。然后,我在Series上执行几个操作,然后使用更改更新原始数据帧行。
所有这些在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)
时我总是会收到一个系列。有没有办法确保我总能收到一系列的回复?或者至少如果我得到一个只返回1行的数据帧,那么如何将其更改为系列。
答案 0 :(得分:1)
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
将作为列表而不是单个值