在Pandas交叉表中分组索引

emeijp43  于 2023-05-27  发布在  其他
关注(0)|答案(4)|浏览(145)

我在Pandas中有一个dataframe,看起来像这样:

df = pandas.DataFrame({
    'Age': [21,22,21,23,23,21,21],
    'Region': ['North America', 'Europe East', 'Europe West', 'South America',
               'North America', 'North America', 'Europe West'],
    'Answer': ['yes','yes','no','yes','no','no','yes']})

   Age         Region Answer
0   21  North America    yes
1   22    Europe East    yes
2   21    Europe West     no
3   23  South America    yes
4   23  North America     no
5   21  North America     no
6   21    Europe West    yes

我需要一种方法来生成这样的交叉表或透视表:

Answer         no  yes
Continent                
Europe          1    2    
America         2    2

使用Pandas crosstab函数,我设法生成了这个表:

ct = pandas.crosstab(index=df['Region'], columns=df['Answer'])

Answer         no  yes
Region                
Europe East     0    1
Europe West     1    1
North America   2    1
South America   0    1

但是我不知道如何对索引进行分组,因为它们在字符串的某个部分是相同的。
有办法做吗?

8wtpewkr

8wtpewkr1#

您可以使用正则表达式从区域中extract大陆名称。

ct.groupby(
    ct.index.str.extract(r'(Europe|America)', expand=False).rename('Continent'),
    sort=False,
    ).sum()
Answer     no  yes
Continent         
Europe      1    2
America     2    2
pdsfdshx

pdsfdshx2#

您可以创建一个函数来从某个地区获取大陆名称,并使用生成的系列作为数据的索引。它看起来像这样:

def get_continent(region):
    if 'America' in region:
        return 'America'
    if 'Europe' in region:
        return 'Europe'

    return 'Unknown Continent'

continent = df['Region'].apply(get_continent)
ct = pd.crosstab(index=continent, columns=df['Answer'], rownames=['Continent'])
z9smfwbn

z9smfwbn3#

您可以在交叉表之前.map()。我想如果你有像“中国”这样的地区,这将更加灵活,在这种情况下,你可以将它Map到“亚洲”,而不必创建一个特殊的字符串匹配规则。

region_to_continent = {
    'Europe East': 'Europe',
    'Europe West': 'Europe',
    'North America': 'America',
    'South America': 'America',
}
pd.crosstab(
    index=df['Region'].map(region_to_continent).rename('Continent'),
    columns=df['Answer'],
)
Answer     no  yes
Continent         
America     2    2
Europe      1    2
p8ekf7hl

p8ekf7hl4#

我尝试使用goupby和pivot表,但由于重复而无法工作。你可以试试这个代码:首先提取Region列的公共部分,然后构建交叉表

import pandas 
df['Continent'] = df['Region'].str.extract('(\w+)', expand=False)
result = pandas.crosstab(index=df['Continent'], columns=df['Answer'])
print(result)

相关问题