用标量除以多个熊猫数据帧

时间:2020-06-07 11:17:59

标签: python pandas dataframe

我有几个要按标量划分的数据框。一次将操作应用于单个数据帧会成功更改数据帧,但是尝试编写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

5 个答案:

答案 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