我想知道如何在不使用 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
我想做的是:
谢谢!
编辑:
df 看起来像:
df = pd.DataFrame(index=range(10,1000,10), columns=['a1','a2','a3'])
答案 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