遍历 pandas 行并根据其他列中的值设置列值

Posted

技术标签:

【中文标题】遍历 pandas 行并根据其他列中的值设置列值【英文标题】:iterate over pandas rows and set column values based on values in other column 【发布时间】:2019-08-02 12:57:53 【问题描述】:

我有一个数据框,其中一列 (col1) 包含值 Y 或 N。我想根据 col1 中的值将值(随机,非重复数字)分配给下一列 (col2) - 如果col1 中的值等于 N,则 col2 中的值将是某个数字,如果 col1 中的值等于 Y,则 col2 中的值将重复前一个。我尝试创建一个 for 循环并使用 df.iterrows() 遍历行,但是 col2 中的数字对于所有 N 都是相等的。

我要获取的数据框示例:

df = pd.DataFrame([[N, Y, Y, N, N, Y], [1, 1, 1, 2, 3, 3]])

对于每一个新的 N 新数字在其他列中分配,而对于每个 Y,数字与前一行一样重复。

【问题讨论】:

【参考方案1】:

假设一个 DataFrame df:

df = pd.DataFrame(['N', 'Y', 'Y', 'N', 'N', 'Y'], columns=['YN'])
    YN
0   N
1   Y
2   Y
3   N
4   N
5   Y

使用itertuples(不重复):

np.random.seed(42)
arr = np.arange(1, len(df[df.YN == 'N']) + 1)
np.random.shuffle(arr)

cnt = 0
for idx, val in enumerate(df.itertuples()):
    if df.YN[idx] == 'N':
        df.loc[idx, 'new'] = arr[cnt]
        cnt += 1
    else:
        df.loc[idx, 'new'] = np.NaN
df.new = df.new.ffill().astype(int)
df
    YN  new
0   N   1
1   Y   1
2   Y   1
3   N   2
4   N   3
5   Y   3

使用apply(数字范围小可能会出现重复):

np.random.seed(42)
df['new'] = df.YN.apply(lambda x: np.random.randint(10) if x == 'N' else np.NaN).ffill().astype(int)
    YN  new
0   N   6
1   Y   6
2   Y   6
3   N   3
4   N   7
5   Y   7

【讨论】:

非常感谢!这是我想要得到的。但是,分配给 df['new'] 的数字有时是重复的。你知道如何解决它吗?所以对于每一个新的 N,df['new'] 中都会有一个以前没有出现过的数字?

以上是关于遍历 pandas 行并根据其他列中的值设置列值的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas 数据框列值来透视其他列

根据其他列中的值在 python 3 (pandas) 数据框中创建新列

如果选中复选框,则循环遍历表行并返回列值[重复]

是否有一种方法可以根据其他列减去列值?

有没有一种有效的方法来计算 Pandas 中的列值,使用基于其他列的条件值的前行的值?

遍历 pandas 数据框中的行并匹配列表中的元组并创建一个新的 df 列