【问题标题】:How can I avoid for-loops using pandas?如何避免使用熊猫的 for 循环?
【发布时间】:2021-06-08 01:26:49
【问题描述】:

如果可能的话,我很想知道如何在不使用 for 循环的情况下优化此代码。我要做的是对 df['Состояние'] 系列中的所有值进行分类,逐一查看列表 list_rep 和 list_dem 中的关键词。谢谢!

conditions = ['a','b']
list_rep = ['a1','a2']
list_dem = ['b1','b2']

for i in list_rep:
    df['Состояние'] = [conditions[0] if i in str(x).lower() else x for x in df['Состояние']]

for i in list_exp:
    df['Состояние'] = [conditions[1] if i in str(x).lower() else x for x in df['Состояние']]    

for i in conditions:
    df['Состояние'] = [i if i in str(x).lower() else x for x in df['Состояние']]

df['Состояние'] = [x if x in conditions else '-' for x in df['Состояние']]

【问题讨论】:

  • 您能否添加一些具有预期输出的数据样本 - 5-6 行?
  • 我希望得到一个值为 'a'、'b' 或 '-' 的系列。
  • 我的解决方案效果如何?

标签: python python-3.x pandas loops for-loop


【解决方案1】:

首先使用Series.str.lower,然后使用Series.str.containsjoin by | 为正则表达式OR 并在numpy.select 中设置新值,然后使用Series.str.extract 并替换缺失值:

df = pd.DataFrame({'Состояние':['abc','def','opa1','ujb2','a1sb1d','B21op']})
print (df)
  Состояние
0       abc
1       def
2      opa1
3      ujb2
4    a1sb1d
5     B21op

conditions = ['a','b']
list_rep = ['a1','a2']
list_dem = ['b1','b2']


s = df['Состояние'].str.lower()
m1 = s.str.contains('|'.join(list_rep))
m2 = s.str.contains('|'.join(list_dem))

df['Состояние'] = np.select([m1, m2], [conditions[0], conditions[1]], s)

df['Состояние'] = df['Состояние'].str.extract(f'({"|".join(conditions)})').fillna('-')
print (df)
  Состояние
0         a
1         -
2         a
3         b
4         a
5         b

另一个想法是创建映射字典,首先使用Series.str.lowerSeries.str.extract,然后使用Series.map,最后替换缺失值:

conditions = ['a','b']
list_rep = ['a1','a2']
list_dem = ['b1','b2']

d = {**dict.fromkeys(list_rep,conditions[0]),
     **dict.fromkeys(list_dem,conditions[1]),
     **dict(zip(conditions,conditions))}
print (d)
{'a1': 'a', 'a2': 'a', 'b1': 'b', 'b2': 'b', 'a': 'a', 'b': 'b'}

pat = rf'({"|".join(d.keys())})'
df['Состояние'] = (df['Состояние'].str.lower()
                                  .str.extract(pat, expand=False)
                                  .map(d)
                                  .fillna('-'))
print (df)
  Состояние
0         a
1         -
2         a
3         b
4         a
5         b

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多