请考虑以下内容:
>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame(np.random.randn(5, 2), index=[100, 101, 101, 102, 103])
>>> idx = set(df.index)
>>> for id_ in idx:
... slice = df.loc[id_]
... # stuff with slice
>>>
我需要在slice
循环内使用for
做某事,但是这些事情是基于slice
是DataFrame
的。如果有多个匹配记录,则slice
是DataFrame
,否则是Series
。我知道pandas.Series
有Series.to_frame
方法,但是pandas.DataFrame
没有(所以我不能只叫df.loc[id_].to_frame()
)。
测试并将slice
强制转换为DataFrame
的最佳方法是什么?
(真的和测试isinstance(df.loc[id_], pd.Series)
一样简单吗?)
答案 0 :(得分:1)
您可以按索引(level=0
的{{3}}对象进行循环:
for i, df1 in df.groupby(level=0):
print (df1)
0 1
100 -0.812375 -0.450793
0 1
101 1.070801 0.217421
101 -1.175859 -0.926117
0 1
102 -0.993948 0.586806
0 1
103 1.063813 0.237741
您的解决方案应通过选择双[]
作为回报DataFrame
来更改:
idx = set(df.index)
for id_ in idx:
df1 = df.loc[[id_]]
print (df1)
0 1
100 -0.775057 -0.979104
0 1
101 -1.549363 -1.206828
101 0.445008 -0.173086
0 1
102 1.488947 -0.79252
0 1
103 1.838997 -0.439362
答案 1 :(得分:1)
或使用df[...]
条件df.index
:
...
for id_ in idx:
slice = df[df.index==id_]
print(slice)
输出:
0 1
100 2.751189 1.978744
0 1
101 0.154483 1.646657
101 1.381725 0.982819
0 1
102 0.26669 0.032702
0 1
103 0.186235 -0.481184
答案 2 :(得分:0)
您可以使用pd.Dataframe init方法将变量切片强制为pandas数据帧,如下所示:
for id_ in idx:
slice = pd.DataFrame(df.loc[id_])
print(type(slice))
输出:
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
然后,您可以将变量视为循环内的数据帧。