我有一个包含以下列的数据框
import pandas as pd
df = pd.DataFrame({'num': [1, 2, 2, 3, 4, 5, 6]})
Run Code Online (Sandbox Code Playgroud)
我想创建一个列,用于df['num'].shift()将当前单元格值与其下方的单元格值进行比较,如果匹配,则该值应为 True 或 False。
预期输出:
num matches?
0 1 False
1 2 True
2 2 False
3 3 False
4 4 False
5 5 False
6 6 False
Run Code Online (Sandbox Code Playgroud)
我无法找到迭代每个单元格并比较条件以及当我使用以下内容时的最佳方法:
df['matches?'] = ''
for i in range(len(df)):
if df['num'] == df['num'].shift(1):
df['matches?'] = True
else:
df['matches?'] = False
Run Code Online (Sandbox Code Playgroud)
import pandas as pd
df = pd.DataFrame({'num': [1, 2, 2, 3, 4, 5, 6]})
Run Code Online (Sandbox Code Playgroud)
如何以最简单的方式实现这一目标?
当您使用时shift,不需要循环,该操作将被矢量化并为您完成:
df['matches?'] = df['num'].shift(-1)==df['num']
Run Code Online (Sandbox Code Playgroud)
输出:
num matches?
0 1 False
1 2 True
2 2 False
3 3 False
4 4 False
5 5 False
6 6 False
Run Code Online (Sandbox Code Playgroud)
编辑
如果你想保留循环逻辑:
for ix, row in df.iterrows():
if ix < len(df)-1:
if df.loc[ix, 'num'] == df.loc[ix+1, 'num']:
df.loc[ix, 'matches?'] = True
else:
df.loc[ix, 'matches?'] = False
else: #last observation
df.loc[ix, 'matches?'] = False
Run Code Online (Sandbox Code Playgroud)
输出:
num matches?
0 1 False
1 2 True
2 2 False
3 3 False
4 4 False
5 5 False
6 6 False
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5268 次 |
| 最近记录: |