gpt4 book ai didi

python - 通过操作现有列创建新列

转载 作者:行者123 更新时间:2023-12-01 01:56:15 25 4
gpt4 key购买 nike

我的数据框中有很多列,我想通过操作同一数据框中的其他两列来填充一列

col1 | col2 | col3 | col4
nan 1 2 4
2 2 2 3
3 nan 1 2

如果 nan 存在于 col1 、col2 和 col3 值的基础上,我想要填充 col1 、col2 和 col3 的值。

我的代码如下:

indices_of_nan_cell = [(index,col1,col2,col3) for index,(col1,col2,col3) in enumerate(zip(col1,col2,col3)) if str(col1)=='nan' or str(col2)=='nan' or str(col3)=='nan']


for nan_values in indices:
if np.isnan(nan_values[1]) or nan_values[1] == 'nan':
read4['col1'][nan_values[0]]=float(nan_values[2])*float(nan_values[3])
if np.isnan(nan_values[2]) or nan_values[2] == 'nan':
read4['col2'][nan_values[0]]=float(nan_values[1])/float(nan_values[3])
if np.isnan(nan_values[3]) or nan_values[3] == 'nan':
read4['col3'][nan_values[0]]=float(nan_values[1])*float(nan_values[2])

它对我来说工作正常,但是由于我的数据框中有数千行,因此需要花费很多时间,有什么有效的方法可以做到这一点吗?

最佳答案

我相信需要 fillna 用于更换NaN仅限 mul , div 和参数fill_value用于更换NaN除法和乘法中的 s:

df['col1'] = df['col1'].fillna(df['col2'].mul(df['col3'], fill_value=1))
df['col2'] = df['col2'].fillna(df['col1'].div(df['col3'], fill_value=1))
df['col3'] = df['col3'].fillna(df['col1'].mul(df['col2'], fill_value=1))

print (df)
col1 col2 col3 col4
0 2.0 1.0 2 4
1 2.0 2.0 2 3
2 3.0 3.0 1 2

另一种方法仅适用于 NaN行:

m1 = df['col1'].isna()
m2 = df['col2'].isna()
m3 = df['col3'].isna()
#oldier versions of pandas
#m1 = df['col1'].isnull()
#m2 = df['col2'].isnull()
#m3 = df['col3'].isnull()

df.loc[m1, 'col1'] = df.loc[m1, 'col2'].mul(df.loc[m1, 'col3'], fill_value=1)
df.loc[m2, 'col2'] = df.loc[m2, 'col1'].div(df.loc[m2, 'col3'], fill_value=1)
df.loc[m3, 'col3'] = df.loc[m3, 'col1'].mul(df.loc[m3, 'col2'], fill_value=1)

说明:

  1. 使用 isna 过滤每一列用于 3 个独立的 bool 掩码。
  2. 对于每个掩码,首先过滤行,例如 df.loc[m1, 'col2']以及倍数或除法
  3. 上次分配回来 - 替换 NaN只是因为再次过滤 df.loc[m1, 'col1']

关于python - 通过操作现有列创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50155148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com