当前位置: 首页 > 面试题库 >

有效地将一列中的值替换为另一列Pandas DataFrame

拓拔麒
2023-03-14
问题内容

我有一个这样的Pandas DataFrame:

   col1 col2 col3
1   0.2  0.3  0.3
2   0.2  0.3  0.3
3     0  0.4  0.4
4     0    0  0.3
5     0    0    0
6   0.1  0.4  0.4

我只想在col1值等于0的情况下用第二列(col2)中的值替换值col1,然后(对于剩余的零值),再次使用第三列(col3)进行替换。期望的结果是下一个:

   col1 col2 col3
1   0.2  0.3  0.3
2   0.2  0.3  0.3
3   0.4  0.4  0.4
4   0.3    0  0.3
5     0    0    0
6   0.1  0.4  0.4

我使用该pd.replace函数完成了此操作,但它似乎太慢了。我认为这一定是一种更快的方法。

df.col1.replace(0,df.col2,inplace=True)
df.col1.replace(0,df.col3,inplace=True)

使用其他功能而不是该pd.replace功能,有没有更快的方法呢?


问题答案:

使用起来np.where更快。使用与您使用类似的模式replace

df['col1'] = np.where(df['col1'] == 0, df['col2'], df['col1'])
df['col1'] = np.where(df['col1'] == 0, df['col3'], df['col1'])

但是,使用嵌套np.where稍微快一点:

df['col1'] = np.where(df['col1'] == 0, 
                      np.where(df['col2'] == 0, df['col3'], df['col2']),
                      df['col1'])

时机

使用以下设置来产生更大的示例DataFrame和计时函数:

df = pd.concat([df]*10**4, ignore_index=True)

def root_nested(df):
    df['col1'] = np.where(df['col1'] == 0, np.where(df['col2'] == 0, df['col3'], df['col2']), df['col1'])
    return df

def root_split(df):
    df['col1'] = np.where(df['col1'] == 0, df['col2'], df['col1'])
    df['col1'] = np.where(df['col1'] == 0, df['col3'], df['col1'])
    return df

def pir2(df):
    df['col1'] = df.where(df.ne(0), np.nan).bfill(axis=1).col1.fillna(0)
    return df

def pir2_2(df):
    slc = (df.values != 0).argmax(axis=1)
    return df.values[np.arange(slc.shape[0]), slc]

def andrew(df):
    df.col1[df.col1 == 0] = df.col2
    df.col1[df.col1 == 0] = df.col3
    return df

def pablo(df):
    df['col1'] = df['col1'].replace(0,df['col2'])
    df['col1'] = df['col1'].replace(0,df['col3'])
    return df

我得到以下计时:

%timeit root_nested(df.copy())
100 loops, best of 3: 2.25 ms per loop

%timeit root_split(df.copy())
100 loops, best of 3: 2.62 ms per loop

%timeit pir2(df.copy())
100 loops, best of 3: 6.25 ms per loop

%timeit pir2_2(df.copy())
1 loop, best of 3: 2.4 ms per loop

%timeit andrew(df.copy())
100 loops, best of 3: 8.55 ms per loop

我尝试计时您的方法,但是它已经运行了几分钟,但没有完成。作为比较,仅对6行示例DataFrame(而不是上面测试的较大行)计时您的方法就花费了12.8
ms。



 类似资料:
  • 问题内容: 我想用相邻列中的值替换一列中的空值,例如,如果我有 我希望它是: 尝试过 但是没用,它说值应该是浮点数,整数,长整数,字符串或字典 有任何想法吗? 问题答案: 最后找到一个替代方案:

  • 我有一个非常简单的问题。然而,我所能找到的都是非常复杂的答案,并不完全符合我的需求。 最接近的,我在这里发现: 弗洛德尔和埃迪的回答(data.table) 但是,我想额外指定如何根据不同列中的值处理指定列中的NA。 我有一个data.table,其中包含NA列,其中< code>fac是一个因子变量。 我想做的是根据< code>iso3c中的值将值< code>D和< code>E分配给< c

  • 问题内容: 我想将一列的值除以另一列的值,并将结果显示为单独的列 前任: 现在我想将总百分比除以屏幕编号,然后在另一列中显示结果 问题答案:

  • 我在Python中使用这个熊猫数据帧。 我需要用Farheit列中的值替换列中的所有NaN。 这就是我需要的: 如果进行布尔选择,一次只能选择其中一列。问题是,如果我尝试加入他们,我无法在保持正确顺序的同时做到这一点。 我如何才能只找到带有s的行,并用列的同一行中的值替换它们?

  • 如何在同一表中从一列插入值到另一列? 说我有: 我要求: 换句话说,我想复制'Suburb2'和'Date',并将它们分别作为新行插入'Date'和'suburban'。 我知道我可以通过首先复制到临时列/s并稍后清理来实现这一点,但我想知道是否有一种方法可以在一个查询中实现这一点? 我试过了 但得到的列“日期”不存在错误。

  • 我想将数据帧列中的一个值替换为另一个值,我必须对许多列执行此操作(假设30/100列) 我已经经历过这个和这个了。 我可以在y列和z列中分别用Null替换“baz”。但我想对所有列都这样做——类似于下面的列表理解方式