Python 熊猫:有没有一种方法可以将列中的值组合在一起?

Python 熊猫:有没有一种方法可以将列中的值组合在一起?,python,pandas,Python,Pandas,我使用pandas来处理一个数据帧,其中一列被称为“Rank”,表示军事级别。当我对数据使用groupby并创建交叉表时,我注意到Rank中的一些值是同义词。例如,我的交叉表中有单独的行用于“Private 1st Class”、“Private 1st Class”和“PFC” 假设我可以手动创建一个字典,将所有这些“同义词”关联在一起,是否有办法让pandas将其应用于我的数据帧,以便在计数、交叉表等方面,所有值都被认为是相同的?因此,对于上面的示例,如果我决定对“PFC”进行标准化,我将创

我使用pandas来处理一个数据帧,其中一列被称为“Rank”,表示军事级别。当我对数据使用
groupby
并创建
交叉表时,我注意到
Rank
中的一些值是同义词。例如,我的交叉表中有单独的行用于“Private 1st Class”、“Private 1st Class”和“PFC”

假设我可以手动创建一个字典,将所有这些“同义词”关联在一起,是否有办法让pandas将其应用于我的数据帧,以便在计数、交叉表等方面,所有值都被认为是相同的?因此,对于上面的示例,如果我决定对“PFC”进行标准化,我将创建以下内容:
{“Private 1st Class”:“PFC”,“Private 1st Class”:“PFC”}


我查看了
groupby
,但据我所知,它按列对整个框架进行排序,不支持这样的等价值。如果我错了,请有人给我指出文档的相关部分好吗?

给你举个例子:

数据:

口述翻译:

translate = pd.DataFrame.from_records({"key": ["Private 1st class", "PFC", "Private First Class"],
                           "harmonizedkey": ["PFC", "PFC", "PFC"]})
让我们将dict合并到
df

newdf = pd.merge(df, translate, how = "left", on = "key")
创建一个新的(完整的)组:

现在,使用
groupby

newdf.groupby("newgroup").sum()

        val
newgroup    
PFC     6
other   9

将地图与词典一起使用以生成新列:

import pandas as pd
df = pd.DataFrame([
    ('Private 1st Class', 3),
    ('Private First Class', 2),
    ('PFC', 5),
    ('Sergeant', 2),
    ('SGT', 2)
], columns = ['rank', 'bannanas'])

d = {
    'Private 1st Class': 'PFC',
    'Private First Class': 'PFC',
    'PFC': 'PFC',
    'Sergeant': 'SGT',
    'SGT': 'SGT'
}

df['merged_rank'] = df['rank'].map(d)
print(df)
                  rank  bannanas merged_rank
0    Private 1st Class         3         PFC
1  Private First Class         2         PFC
2                  PFC         5         PFC
3             Sergeant         2         SGT
4                  SGT         2         SGT

print(df.groupby('merged_rank')['bannanas'].agg('sum'))   

merged_rank
PFC    10
SGT     4
Name: bannanas, dtype: int64   

您能否在数据框中创建一个新列,其中包含“标准化排名”和新列上的
groupby
?将您的词典转换为一个
dataframe
将其与原始列和
groupby
新列合并。
newdf.groupby("newgroup").sum()

        val
newgroup    
PFC     6
other   9
import pandas as pd
df = pd.DataFrame([
    ('Private 1st Class', 3),
    ('Private First Class', 2),
    ('PFC', 5),
    ('Sergeant', 2),
    ('SGT', 2)
], columns = ['rank', 'bannanas'])

d = {
    'Private 1st Class': 'PFC',
    'Private First Class': 'PFC',
    'PFC': 'PFC',
    'Sergeant': 'SGT',
    'SGT': 'SGT'
}

df['merged_rank'] = df['rank'].map(d)
print(df)
                  rank  bannanas merged_rank
0    Private 1st Class         3         PFC
1  Private First Class         2         PFC
2                  PFC         5         PFC
3             Sergeant         2         SGT
4                  SGT         2         SGT

print(df.groupby('merged_rank')['bannanas'].agg('sum'))   

merged_rank
PFC    10
SGT     4
Name: bannanas, dtype: int64