我有几个要按标量划分的数据框。一次将操作应用于单个数据帧会成功更改数据帧,但是尝试编写for循环以执行相同的操作将导致数据帧不变。为什么是这样?如何编写以下循环来更改数据帧?
# List of dataframes
dflist = [df1,df2,df3]
for i in dflist:
i = i/1000 # This loop does not affect the dataframes
df1=df1/1000
df2=df2/1000
df3=df3/1000 # These commands do affect the dataframes
答案 0 :(得分:1)
dflist = [df1, df2, df3]
[*map(lambda x: x/1000, dflist)]
答案 1 :(得分:1)
你可能很明确
df1, df2, df3 = [frame/1000 for frame in dflist]
dflist
中的数据帧无法访问变量名称,而直接引用这些值。在列表理解后,重新分配变量名称即可获得我们期望的结果。希望这种解释会有所帮助。
答案 2 :(得分:0)
这是因为在for
循环实现中,您要更新i
而不是列表本身的元素。将for
循环更改为以下内容即可:
dflist = [df1,df2,df3]
for i in range(len(dflist)):
dflist[i] = dflist[i]/1000
尽管它仍然不会更新dfi
,因为它将用新元素替换list的元素。另一种方式是:
df1, df2, df3 = [df/1000 for df in [df1,df2,df3]]
答案 3 :(得分:0)
您正在寻找的是一种可以进行适当分割的方法。据我所知,pandas不直接支持它,但是有一种解决方法-分配给所有列而不是数据框。
df1 = pd.DataFrame(np.arange(0, 50).reshape(10, 5))
df2 = pd.DataFrame(np.arange(50, 100).reshape(10, 5))
df3 = pd.DataFrame(np.arange(100, 150).reshape(10, 5))
df_list = [df1, df2, df3]
for df in df_list:
df[df.columns] = df[df.columns] / 10
如果您print(df1)
,您将获得:
0 1 2 3 4
0 0.0 0.1 0.2 0.3 0.4
1 0.5 0.6 0.7 0.8 0.9
2 1.0 1.1 1.2 1.3 1.4
3 1.5 1.6 1.7 1.8 1.9
4 2.0 2.1 2.2 2.3 2.4
5 2.5 2.6 2.7 2.8 2.9
6 3.0 3.1 3.2 3.3 3.4
7 3.5 3.6 3.7 3.8 3.9
8 4.0 4.1 4.2 4.3 4.4
9 4.5 4.6 4.7 4.8 4.9
针对评论中的问题,我将尝试解释就地操作的含义。从根本上讲,就地操作会更改对象本身。非就地操作将创建一个新对象。下面的代码对此进行了演示:
df1 = pd.DataFrame(np.arange(0, 6).reshape(3, 2))
print(df1) => results in
0 1
0 0 1
1 2 3
2 4 5
print(id(df1))
4880614608 ==> this is the id (address) of the original df1
df1 = df1 / 10 ==> this produces a __new__ dataframe.
print(id(df1))
==> 4880613520 # note that this id is different than the previous one.
df1[df1.columns] = df1[df1.columns] * 100
print(df1) ==> this updates df1, and it now contains:
0 1
0 0.0 10.0
1 20.0 30.0
2 40.0 50.0
print(id(df1)) ==> The id / address of df _did_ _not_ change:
4880613520
答案 4 :(得分:0)
尝试一下,
for df in df_list:
# Apply divide only on the numeric columns.
columns = df.select_dtypes("number").columns
df[columns] = df[columns] / 1000