我有多个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的基础上进行,并且真的希望它能在循环中运行。
任何帮助将不胜感激! 感谢。
答案 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)]
)因此,您实际上并未更改df1
或df2
,而是仅向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
指向另一个对象;相反,我们正在改变目标的对象。如果您打印出df1
或df2
,您会看到他们已更改。
因此,您可以选择更改DataFrames(如果方法允许您这样做),或者将DataFrame存储在集合中并更改集合中的对象,如jezrael所做的那样。
答案 2 :(得分:0)
df.drop([要删除的行],轴= 0)