如何删除多个DataFrame中的行?

时间:2017-11-26 15:42:22

标签: pandas

我有多个DataFrame,每个都有一个名为' Year'每个包含1979年到2014年的行。我希望能够遍历我的DataFrame列表并对每个DataFrame应用相同的选择条件,并且只保留行的子集。

我的示例DataFrames:

df1 = pd.DataFrame({"Year": np.arange(1979,2015)})
df2 = pd.DataFrame({"Year": np.arange(1979,2015)})

我的循环:

for df in [df1, df2]:
    df = df[(df['Year'] <= 2013)]

但该代码并没有删除DataFrame的最后几行。     df1.tail() 拥有原始DataFrames拥有的所有行。

但这有效:

foo1 = df1[(df1['Year'] <= 2013)]
foo2 = df2[(df2['Year'] <= 2013)]

我有太多的DataFrame要循环,希望在DataFrame-by-DataFrame的基础上进行,并且真的希望它能在循环中运行。

任何帮助将不胜感激! 感谢。

3 个答案:

答案 0 :(得分:1)

您需要将输出分配给list,因为无法修改原始DataFrame

dfs = []
for df in [df1, df2]:
    dfs.append(df[(df['Year'] <= 2013)])

或使用list comrehension

dfs = [df[(df['Year'] <= 2013)] for df in [df1, df2]]

如果想要dictionary of DataFrames可以使用zip

names = ['a','b'] 
dfs = dict(zip(names, [df[(df['Year'] <= 2013)] for df in [df1, df2]]))
print (dfs['a'])

答案 1 :(得分:1)

当您为名称指定其他对象时,所引用名称的上一个对象不会更改。

例如,让

a = [1, 2]
b = a

现在,如果我继续将b指向另一个对象,a将保持不变:

b = [4, 5]
a
Out: [1, 2]

但是我没有将b指向另一个对象,而是可以修改它指向的对象:

a = [1, 2]
b = a
b.append(3)  
a
Out: [1, 2, 3]

在for循环中,会发生以下情况:

  • 名称df指向df1(循环开始)
  • 名称df指向另一个对象(df1[(df1['Year'] <= 2013)]
  • 名称df指向df2(第二次迭代)
  • 名称df指向另一个对象(df2[(df2['Year'] <= 2013)]

因此,您实际上并未更改df1df2,而是仅向df提供另一个目标。如果您在循环结束时打印df,则会看到它将打印df2[(df2['Year'] <= 2013)]

你可以做的是修改/改变对象:

for df in [df1, df2]:
    df.drop((df[(df['Year'] > 2013)]).index, inplace=True)
    # df = df.drop((df[(df['Year'] > 2013)]).index) wouldn't work

在这里,我们没有将df指向另一个对象;相反,我们正在改变目标的对象。如果您打印出df1df2,您会看到他们已更改。

因此,您可以选择更改DataFrames(如果方法允许您这样做),或者将DataFrame存储在集合中并更改集合中的对象,如jezrael所做的那样。

答案 2 :(得分:0)

df.drop([要删除的行],轴= 0)