如何根据单元格值创建和填充 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_1
和 Freq_2
的新列,用于计算每条记录中数字 1
和数字 2
分别出现的次数.所以,我希望生成的数据框看起来像这样:
那么,让我们看一下名为 Freq_1
:
的专栏
- 对于第一条记录,它等于 1,因为数字
1
在整个第一条记录中只出现一次;
- 对于其他记录,它等于 0,因为数字
1
从未出现过。
现在让我们看一下名为 Freq_2
:
的专栏
- 对于第一条记录,Freq_2等于0,因为没有出现数字
2
;
- 对于第二条记录,Freq_2等于2,因为数字
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
我创建了一个名为 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_1
和 Freq_2
的新列,用于计算每条记录中数字 1
和数字 2
分别出现的次数.所以,我希望生成的数据框看起来像这样:
那么,让我们看一下名为 Freq_1
:
- 对于第一条记录,它等于 1,因为数字
1
在整个第一条记录中只出现一次; - 对于其他记录,它等于 0,因为数字
1
从未出现过。
现在让我们看一下名为 Freq_2
:
- 对于第一条记录,Freq_2等于0,因为没有出现数字
2
; - 对于第二条记录,Freq_2等于2,因为数字
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