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