Pandas将过滤后的行附加到另一个DataFrame

1 投票
1 回答
1828 浏览
提问于 2025-04-17 20:27

我有两个 pandas 数据框,分别叫做 dfdf_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 ])

根据列表 vehicleslimit_states,你可能也可以通过使用 groupby 来实现你想要的效果;像这样:

fn = lambda a: a[(a.RF == np.min(a.RF))].head(1)
df.groupby( ['VEHICLE', 'LIMIT_STATE'] ).apply( fn )

撰写回答