根据 pandas 中的条件更改数据框的第一行
Change 1st row of a dataframe based on a condition in pandas
我有 2 列的值,我只想更新第三列的 1 行。
我有-
df = pd.DataFrame({'A':[1,1,2,3,4,4],
'B':[2,2,4,3,2,1],
'C':[0] * 6})
print (df)
A B C
0 1 2 0
1 1 2 0
2 2 4 0
3 3 3 0
4 4 2 0
5 4 1 0
如果 A=1 和 B=2,那么只有第一行有 C=1,就像这样 -
print (df)
A B C
0 1 2 1
1 1 2 0
2 2 4 0
3 3 3 0
4 4 2 0
5 4 1 0
目前我已经使用
df.loc[(df['A']==1) & (df['B']==2)].iloc[[0]].loc['C'] = 1
但它不会更改数据帧。
如果总是匹配至少一行的解决方案:
创建布尔掩码并设置第一个 True
索引值 idxmax
:
mask = (df['A']==1) & (df['B']==2)
df.loc[mask.idxmax(), 'C'] = 1
但是如果没有值匹配 idxmax
return 第一个 False
值,那么添加 if-else
:
mask = (df['A']==1) & (df['B']==2)
idx = mask.idxmax() if mask.any() else np.repeat(False, len(df))
df.loc[idx, 'C'] = 1
print (df)
A B C
0 1 2 1
1 1 2 0
2 2 4 0
3 3 3 0
4 4 2 0
5 4 1 0
mask = (df['A']==10) & (df['B']==20)
idx = mask.idxmax() if mask.any() else np.repeat(False, len(df))
df.loc[idx, 'C'] = 1
print (df)
A B C
0 1 2 0
1 1 2 0
2 2 4 0
3 3 3 0
4 4 2 0
5 4 1 0
使用pd.Series.cumsum
确保只满足第一个匹配条件:
mask = df['A'].eq(1) & df['B'].eq(2)
df.loc[mask & mask.cumsum().eq(1), 'C'] = 1
print(df)
A B C
0 1 2 1
1 1 2 0
2 2 4 0
3 3 3 0
4 4 2 0
5 4 1 0
如果性能是一个问题,请参阅 。
我有 2 列的值,我只想更新第三列的 1 行。
我有-
df = pd.DataFrame({'A':[1,1,2,3,4,4],
'B':[2,2,4,3,2,1],
'C':[0] * 6})
print (df)
A B C
0 1 2 0
1 1 2 0
2 2 4 0
3 3 3 0
4 4 2 0
5 4 1 0
如果 A=1 和 B=2,那么只有第一行有 C=1,就像这样 -
print (df)
A B C
0 1 2 1
1 1 2 0
2 2 4 0
3 3 3 0
4 4 2 0
5 4 1 0
目前我已经使用
df.loc[(df['A']==1) & (df['B']==2)].iloc[[0]].loc['C'] = 1
但它不会更改数据帧。
如果总是匹配至少一行的解决方案:
创建布尔掩码并设置第一个 True
索引值 idxmax
:
mask = (df['A']==1) & (df['B']==2)
df.loc[mask.idxmax(), 'C'] = 1
但是如果没有值匹配 idxmax
return 第一个 False
值,那么添加 if-else
:
mask = (df['A']==1) & (df['B']==2)
idx = mask.idxmax() if mask.any() else np.repeat(False, len(df))
df.loc[idx, 'C'] = 1
print (df)
A B C
0 1 2 1
1 1 2 0
2 2 4 0
3 3 3 0
4 4 2 0
5 4 1 0
mask = (df['A']==10) & (df['B']==20)
idx = mask.idxmax() if mask.any() else np.repeat(False, len(df))
df.loc[idx, 'C'] = 1
print (df)
A B C
0 1 2 0
1 1 2 0
2 2 4 0
3 3 3 0
4 4 2 0
5 4 1 0
使用pd.Series.cumsum
确保只满足第一个匹配条件:
mask = df['A'].eq(1) & df['B'].eq(2)
df.loc[mask & mask.cumsum().eq(1), 'C'] = 1
print(df)
A B C
0 1 2 1
1 1 2 0
2 2 4 0
3 3 3 0
4 4 2 0
5 4 1 0
如果性能是一个问题,请参阅