Pandas将过滤后的行附加到另一个DataFrame
我有两个 pandas 数据框,分别叫做 df
和 df_min
。我对 df
进行了过滤,结果只得到了一个数据行,我想把这一行添加到 df_min
中。我尝试用循环遍历 df
,还尝试用 loc
来把这一行加到 df_min
里。但是我总是遇到一个错误,提示 Incompatible indexer with DataFrame
,这说明我在使用 loc
的时候可能有问题。那么,有什么好的方法可以实现我想做的事情呢?
i = 0
for elem in vehicles:
for state in limit_states:
a = df[(df.VEHICLE == elem) & (df.LIMIT_STATE == state)]
df_min.loc[i] = a[(a.RF == np.min(a.RF))].head(1) #results in a single row
i = i + 1
补充:我还尝试了其他方法来代替 loc
,但还是遇到了同样的错误:
df_min.ix[i] = a[(a.RF == np.min(a.RF))].head(1)
补充 2:我尝试了另外一种方法,这次出现了一个错误,提示“第一个参数必须是类似列表的 pandas 对象,但你传入的是一个类型为 'DataFrame' 的对象”。
for elem in vehicles:
for state in limit_states:
a = df[(df.VEHICLE == elem) & (df.LIMIT_STATE == state)]
df_min = pd.concat(a[(a.RF == np.min(a.RF))].head(1))
1 个回答
1
可能像这样会对你有帮助:
df_min = pd.concat([ df[(df.VEHICLE == elem) & (df.LIMIT_STATE == state)]
for elem in vehicles for state in limit_states ])
编辑:
xs = [ df[(df.VEHICLE == elem) & (df.LIMIT_STATE == state)]
for elem in vehicles for state in limit_states ]
df_min = pd.concat([ a[(a.RF == np.min(a.RF))].head(1) for a in xs ])
根据列表 vehicles
和 limit_states
,你可能也可以通过使用 groupby
来实现你想要的效果;像这样:
fn = lambda a: a[(a.RF == np.min(a.RF))].head(1)
df.groupby( ['VEHICLE', 'LIMIT_STATE'] ).apply( fn )