【问题标题】:What's the fastest way to select values from columns based on keys in another columns in pandas?根据熊猫中另一列中的键从列中选择值的最快方法是什么?
【发布时间】:2019-08-29 22:29:02
【问题描述】:

我需要一种快速的方法来从 pandas 数据框中提取正确的值: 给定一个在多个命名列中包含(大量)数据的数据框和一个其值仅包含其他列名称的附加列,我如何从数据列中选择值,并将附加列作为键?

通过显式循环很简单,但是在 DataFrame 上直接使用 .iterrows() 之类的东西会非常慢。如果转换为 numpy-arrays,它会更快,但仍然不快。我可以结合 pandas 的方法来更快地完成它吗?

示例:这是一种 DataFrame 结构,其中 AB 列包含数据,keys 列包含可供选择的键:

import pandas
df = pandas.DataFrame(
    {'A': [1,2,3,4],
     'B': [5,6,7,8],
     'keys': ['A','B','B','A']},
)
print(df)

输出:

Out[1]: 
   A  B keys
0  1  5    A
1  2  6    B
2  3  7    B
3  4  8    A

现在我需要一些 快速 代码来返回类似的 DataFrame

Out[2]: 
   val_keys
0         1
1         6
2         7
3         4

我的想法是这样的:

tmp = df.melt(id_vars=['keys'], value_vars=['A','B'])
out = tmp.loc[a['keys']==a['variable']]

产生:

Out[2]: 
  keys variable  value
0    A        A      1
3    A        A      4
5    B        B      6
6    B        B      7

但没有正确的顺序或索引。所以这不是一个完全的解决方案。

有什么建议吗?

【问题讨论】:

    标签: python pandas performance


    【解决方案1】:

    看看这些是否适合你

    df['val_keys']= np.where(df['keys'] =='A', df['A'],df['B'])
    

    df['val_keys']= np.select([df['keys'] =='A', df['keys'] =='B'], [df['A'],df['B']])
    

    无需为下面的代码指定任何内容!

    def value(row):
        a = row.name
        b = row['keys']
        c = df.loc[a,b]
        return c
    df.apply(value, axis=1)
    

    【讨论】:

    • 它们适用于最小的示例,但在有 20-30 个“数据”列(我称之为 A 和 B)而不是只有两个的情况下并不是很好。
    • 是的,它产生了正确的输出,但它确实很慢,因为它实际上是一个显式的 for 循环访问 df 的行,这不是一个快速的解决方案
    【解决方案2】:

    您是否尝试过过滤然后映射:

    df_A = df[df['key'].isin(['A'])]
    df_B = df[df['key'].isin(['B'])]
    
    A_dict = dict(zip(df_A['key'], df_A['A']))
    B_dict = dict(zip(df_B['key'], df_B['B']))
    
    df['val_keys'] = df['key'].map(A_dict)
    df['val_keys'] = df['key'].map(B_dict).fillna(df['val_keys'])      # non-exhaustive mapping for the second one
    

    您的df['val_keys'] 列现在将包含您的 val_keys 输出中的结果。

    如果您愿意,您可以通过以下方式将该列保留为预期输出:

    df = df[['val_keys']]
    

    希望这会有所帮助:))

    【讨论】:

      猜你喜欢
      • 2022-06-15
      • 2021-11-30
      • 2020-08-09
      • 2020-11-26
      • 2018-08-05
      • 2018-06-25
      • 2015-10-23
      相关资源
      最近更新 更多