【发布时间】:2021-08-07 19:19:23
【问题描述】:
这个问题是this question 的扩展。考虑下表中可视化的 pandas DataFrame。
| respondent | brand | engine | country | aware | aware_2 | aware_3 | age | tesst | set | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | a | volvo | p | swe | 1 | 0 | 1 | 23 | set | set |
| 1 | b | volvo | None | swe | 0 | 0 | 1 | 45 | set | set |
| 2 | c | bmw | p | us | 0 | 0 | 1 | 56 | test | test |
| 3 | d | bmw | p | us | 0 | 1 | 1 | 43 | test | test |
| 4 | e | bmw | d | germany | 1 | 0 | 1 | 34 | set | set |
| 5 | f | audi | d | germany | 1 | 0 | 1 | 59 | set | set |
| 6 | g | volvo | d | swe | 1 | 0 | 0 | 65 | test | set |
| 7 | h | audi | d | swe | 1 | 0 | 0 | 78 | test | set |
| 8 | i | volvo | d | us | 1 | 1 | 1 | 32 | set | set |
要转换带有字符串条目的列,应该先做一个映射然后pandas.replace()。
例如:
mapping = {'set': 1, 'test': 2}
df.replace({'set': mapping, 'tesst': mapping})
这将导致以下 DataFrame(表):
| respondent | brand | engine | country | aware | aware_2 | aware_3 | age | tesst | set | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | a | volvo | p | swe | 1 | 0 | 1 | 23 | 1 | 1 |
| 1 | b | volvo | None | swe | 0 | 0 | 1 | 45 | 1 | 1 |
| 2 | c | bmw | p | us | 0 | 0 | 1 | 56 | 2 | 2 |
| 3 | d | bmw | p | us | 0 | 1 | 1 | 43 | 2 | 2 |
| 4 | e | bmw | d | germany | 1 | 0 | 1 | 34 | 1 | 1 |
| 5 | f | audi | d | germany | 1 | 0 | 1 | 59 | 1 | 1 |
| 6 | g | volvo | d | swe | 1 | 0 | 0 | 65 | 2 | 1 |
| 7 | h | audi | d | swe | 1 | 0 | 0 | 78 | 2 | 1 |
| 8 | i | volvo | d | us | 1 | 1 | 1 | 32 | 1 | 1 |
如上所示,最后两列的字符串被替换为代表这些字符串的数字。
那么问题来了: 有没有更快且不那么动手的方法来将所有字符串替换为一个数字?可以自动创建映射(并将其输出到某个地方供人类参考)吗?
使 DataFrame 最终变成这样的东西:
| respondent | brand | engine | country | aware | aware_2 | aware_3 | age | tesst | set | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 23 | 1 | 1 |
| 1 | 2 | 1 | 2 | 1 | 0 | 0 | 1 | 45 | 1 | 1 |
| 2 | 3 | 2 | 1 | 2 | 0 | 0 | 1 | 56 | 2 | 2 |
| 3 | 4 | 2 | 1 | 2 | 0 | 1 | 1 | 43 | 2 | 2 |
| 4 | 5 | 2 | 3 | 3 | 1 | 0 | 1 | 34 | 1 | 1 |
| 5 | 6 | 3 | 3 | 3 | 1 | 0 | 1 | 59 | 1 | 1 |
| 6 | 7 | 1 | 3 | 1 | 1 | 0 | 0 | 65 | 2 | 1 |
| 7 | 8 | 3 | 3 | 1 | 1 | 0 | 0 | 78 | 2 | 1 |
| 8 | 9 | 1 | 3 | 2 | 1 | 1 | 1 | 32 | 1 | 1 |
也输出:
[{'volvo': 1, 'bmw': 2, 'audi': 3}, {'p': 1, 'None': 2, 'd': 3}, {'swe': 1, 'us': 2, 'germany': 3}]
请注意,地图(dicts)的输出列表不应该是硬编码的,而是由代码生成的。
【问题讨论】: