根据没有 for 循环的条件更新数据帧值

时间:2021-04-29 13:42:35

标签: python pandas dataframe

我想知道如何在不使用 for 的情况下执行类似以下代码的操作。

values = [11,20,23,30,32,35,60...]
for new_value in range(10,10000,10):
    if new_value not in values:
        df.at[new_value, 'a2'] = new_value

我想做的是:

  • 我有两个列表:values 和 new_values
  • 如果 new_values 中的元素不在 values 中,则更新 df,其中 new_value 既是索引又是更新后的值。

谢谢!

编辑:

df 看起来像:

df = pd.DataFrame(index=range(10,1000,10), columns=['a1','a2','a3'])

2 个答案:

答案 0 :(得分:1)

尝试从索引和数据相同的 values 创建一个 DataFrame,concat 这个新的 DataFrame 与原始的,使用 groupby.head 只获取每个 id 组的第一行,然后使用 sort_index:

清理订单
import pandas as pd

df = pd.DataFrame(index=range(10, 100, 10), columns=['a1', 'a2', 'a3'])

values = [11, 20, 23, 30, 32, 35, 60]
# Convert list into a DataFrame with index and value the same
values_df = pd.DataFrame(data=values, index=values, columns=['a2'])
# Create new dataframe from df and values_df
new_df = pd.concat((df, values_df))

# Group By index and only keep first from each group
# (not using first() since it would overwrite the NaNs)
new_df = new_df.groupby(new_df.index).head(1).sort_index()

# For Display
print(new_df)

来源 (df):

     a1   a2   a3
10  NaN  NaN  NaN
20  NaN  NaN  NaN
30  NaN  NaN  NaN
40  NaN  NaN  NaN
50  NaN  NaN  NaN
60  NaN  NaN  NaN
70  NaN  NaN  NaN
80  NaN  NaN  NaN
90  NaN  NaN  NaN

输出(new_df):

     a1   a2   a3
10  NaN  NaN  NaN
11  NaN   11  NaN
20  NaN  NaN  NaN
23  NaN   23  NaN
30  NaN  NaN  NaN
32  NaN   32  NaN
35  NaN   35  NaN
40  NaN  NaN  NaN
50  NaN  NaN  NaN
60  NaN  NaN  NaN
70  NaN  NaN  NaN
80  NaN  NaN  NaN
90  NaN  NaN  NaN

答案 1 :(得分:1)

你想要这样的东西吗?

mask = (~df.index.isin(values))
df.loc[mask, 'a2'] = df.loc[mask].index