如何根据单元格值创建和填充 pandas 列

How to create and populate pandas columns based on cell values

我创建了一个名为 df 的数据框,如下所示:

import pandas as pd
d = {'feature1': [1, 22,45,78,78], 'feature2': [33, 2,2,65,65], 'feature3': [100, 2,359,87,2],}
df = pd.DataFrame(data=d)
print(df)

数据框如下所示:

我想创建两个名为 Freq_1Freq_2 的新列,用于计算每条记录中数字 1 和数字 2 分别出现的次数.所以,我希望生成的数据框看起来像这样:

那么,让我们看一下名为 Freq_1:

的专栏

现在让我们看一下名为 Freq_2:

的专栏

如何在 pandas 中创建列 Freq_1 和 Freq_2?

试试这个:

freq = {
    i: df.eq(i).sum(axis=1) for i in range(10)
}

pd.concat([df, pd.DataFrame(freq).add_prefix("Freq_")], axis=1)

结果:

 feature1  feature2  feature3  Freq_0  Freq_1  Freq_2  Freq_3  Freq_4  Freq_5  Freq_6  Freq_7  Freq_8  Freq_9
        1        33       100       0       1       0       0       0       0       0       0       0       0
       22         2         2       0       0       2       0       0       0       0       0       0       0
       45         2       359       0       0       1       0       0       0       0       0       0       0
       78        65        87       0       0       0       0       0       0       0       0       0       0
       78        65         2       0       0       1       0       0       0       0       0       0       0

当列转换为字符串列时,可以执行字符串模式匹配。

d = {'feature1': [1, 22,45,78,78], 'feature2': [33, 2,2,65,65], 'feature3': [100, 2,359,87,2],}
df = pd.DataFrame(data=d)
df = df.stack().astype(str).unstack()

现在我们可以迭代我们正在寻找的每个模式:

usefull_columns = df.columns
for pattern in ['1', '2']:
     df[f'freq_{pattern}'] = df[usefull_columns].stack().str.count(pattern).unstack().max(axis=1)

打印输出:

  feature1 feature2 feature3  freq_1  freq_2
0        1       33      100     1.0     0.0
1       22        2        2     0.0     2.0
2       45        2      359     0.0     1.0
3       78       65       87     0.0     0.0
4       78       65        2     0.0     1.0

我们可以做到

s = df.where(df.isin([1,2])).stack()
out = df.join(pd.crosstab(s.index.get_level_values(0),s).add_prefix('Freq_')).fillna(0)
Out[299]: 
   feature1  feature2  feature3  Freq_1.0  Freq_2.0
0         1        33       100       1.0       0.0
1        22         2         2       0.0       2.0
2        45         2       359       0.0       1.0
3        78        65        87       0.0       0.0
4        78        65         2       0.0       1.0