python - 如何对以下内容进行矢量化,追加可能是瓶颈

标签 python pandas dataframe vectorization

我有以下包含两列 c1c2 的数据框,我想根据以下逻辑添加一个新列 c3,我的工作有效但速度很慢,任何人都可以建议一种对此进行矢量化的方法吗?

  • 必须根据c1c2 进行分组,然后对于每个组,新列c3 必须从 顺序填充values 其中键是 c1 的值,每个“子组”将有后续值,IOW values[value_of_c1][idx],其中 idx 是“子组”,示例如下
  • 第一组(1, 'a'),此处c11,“子组”“a “ 索引是 0(第一个子组 1)所以该组中所有行的 c3values[1][0]
  • 第二组 (1, 'b') 这里 c1 仍然是 1 但“子组”是 "b " 所以索引 1(第二个子组 1)所以对于这个组中的所有行 c3values[1][1]
  • 第三组 (2, 'y') 这里 c1 现在是 2,“子组”是 "a " 并且索引为 0(第一个子组 2),因此对于该组中的所有行,c3values[2][0 ]
  • 等等
  • values 将具有满足此逻辑的必要元素。

代码

import pandas as pd

df = pd.DataFrame(
    {
        "c1": [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2],
        "c2": ["a", "a", "a", "b", "b", "b", "y", "y", "y", "z", "z", "z"],
    }
)
new_df = pd.DataFrame()
values = {1: ["a1", "a2"], 2: ["b1", "b2"]}
for i, j in df.groupby("c1"):
    for idx, (k, l) in enumerate(j.groupby("c2")):
        l["c3"] = values[i][idx]
        new_df = new_df.append(l)

输出(有效但我的代码很慢)

    c1 c2  c3
0    1  a  a1
1    1  a  a1
2    1  a  a1
3    1  b  a2
4    1  b  a2
5    1  b  a2
6    2  y  b1
7    2  y  b1
8    2  y  b1
9    2  z  b2
10   2  z  b2
11   2  z  b2

最佳答案

如果你不介意使用另一个库,你基本上需要在你的组中标记编码:

from sklearn.preprocessing import LabelEncoder

def le(x):
    return pd.DataFrame(LabelEncoder().fit_transform(x),index=x.index)
    
df['idx'] = df.groupby('c1')['c2'].apply(le)

df['c3'] = df.apply(lambda x:values[x['c1']][x['idx']],axis=1)

    c1 c2  idx  c3
0    1  a    0  a1
1    1  a    0  a1
2    1  a    0  a1
3    1  b    1  a2
4    1  b    1  a2
5    1  b    1  a2
6    2  y    0  b1
7    2  y    0  b1
8    2  y    0  b1
9    2  z    1  b2
10   2  z    1  b2
11   2  z    1  b2

否则就是使用 pd.Categorical 的问题,与上面的概念相同,只是你在每个组内转换,将列转换为一个类别,然后提取代码:

def le(x):
    return pd.DataFrame(pd.Categorical(x).codes,index=x.index)

关于python - 如何对以下内容进行矢量化,追加可能是瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70136823/

相关文章:

python-3.x - timedelta 方法的性能缓慢

python - 从列中删除不在范围内的日期

Python 和 urllib2 : how to make a GET request with parameters

python pandas groupby计算变化

python - 使用 Python 导入 Tweepy 时出错

python - Pandas :使用数据框索引重新索引面板

python - 使用 for 循环的数据帧索引

python - BeautifulSoup 刮 table 与 table 休息

python - 在 Python 类中动态定义实例字段

python - TypeError : string indices must be numbers, 不是对象 (Python)