Pandas Group By和计数字符串出现次数

8iwquhpp  于 2023-10-14  发布在  其他
关注(0)|答案(3)|浏览(92)

我有一个框架,并试图将其分组的司,并得到它的计数的基础上,在这里我称之为“问题”列。它有一些空值,我想包括在内。它只有是/否响应。
我一直在试验groupby函数,它看起来并不是我想要的样子。我也想过根据“Question”的字符串响应创建单独的嵌套,并根据除法合并,但也没有成功。
这是我有的

df2 = df.groupby(['Division', 'Question'], dropna=False)['Division'].count().to_frame(name='Total')

我的结果是:

Division   Question   Total
name1      nan         1
name2      No          3
...
name20     Yes         1
name20     No          1
name20     nan         2

我试过使用这个,但它使用该列的总空值作为计数,我希望它基于'问题' == '是'或'问题' == '否'或'问题' == '南'

df2['Null_Counts'] = df.loc[:, 'Question'].isnull().sum()

Division   Question   Total   Null_Counts
name1      nan         1      20 
name2      No          3      20
...
name20     Yes         1      20
name20     No          1      20
name20     nan         2      20

我试图弄清楚如何使“问题”列作为单独的列,使它按部门和问题组。我想包括null值,所以它会这样:

Division   Null_Counts   Yes_Counts   No_Counts   Total
name1      1             nan          nan         1
name2      3             nan          nan         3
...        ...           ..           ...         ...
name20      2             1            1           4

我不在乎它是否读空计数为nan,但它可以是零。

vh0rcniy

vh0rcniy1#

基本上,我发现用字符串替换np.nan更干净(工作得很快)。它还有一个好处,就是当总和为零时,df包含零来代替nan
这样就行了

import pandas as pd
import numpy as np

data = {'Division': ['name1', 'name2', 'name20', 'name20', 'name20'],
        'Question': [np.nan, 'No', 'Yes', 'No', np.nan],
        'Total': [1, 3, 1, 1, 2]}  

df = pd.DataFrame(data)

# Replace NaN with 'unsure'
df['Question'] = df['Question'].fillna('unsure')

df = (df.pivot_table(index='Division', 
                    columns='Question',
                    values='Total', 
                    aggfunc='sum')
       .fillna(0)
       .reset_index())

# Convert columns to integers
df = df.astype({'No': 'int', 'Yes': 'int', 'unsure': 'int'})

df['total'] = df['No'] + df['Yes'] + df['unsure']

print(df)

它返回:

Question Division  No  Yes  unsure  total
0           name1   0    0       1      1
1           name2   3    0       0      3
2          name20   1    1       2      4

从这里您可以自己编辑列标题.

hmmo2u0o

hmmo2u0o2#

我建议尝试以基于批判性思维的简单方法做事,而不是试图找到完美的函数或最短的代码块。isnull、.fillna和np.nan都有自己的特点,但是对于您的应用程序,您可以使用简单的if-elif-else来避免直接评估nan值。一旦你开始工作,你可以担心效率。这种方法也使得用另一种语言来适应类似的任务变得容易得多。

# Creating a sample DataFrame
data = {
    'Division': ['name1', 'name1', 'name2', 'name20', 'name2', 'name1', 'name20', 'name20', 'name1'],
    'Question': ['nan', 'No', 'No', 'Yes', 'Yes', 'No', 'nan', 'No', 'Yes']
}
df = pd.DataFrame(data)

# Initialize an empty list to store dictionaries for each division
result_data = []

# Iterate through the DataFrame by Division
for division, group_df in df.groupby('Division'):
    # Initialize counts
    null_counts = 0
    yes_counts = 0
    no_counts = 0
    
    # Iterate through group_df
    for question_value in group_df['Question']:           
        if question_value == 'Yes':
            yes_counts += 1
        elif question_value == 'No':
            no_counts += 1
        else:
            null_counts += 1 # don't mess with .isnull or any of that
    
    # Calculate the total count
    total_count = yes_counts + no_counts
    
    # Create a dictionary for the current division
    result_dict = {
        'Division': division,
        'Null_Counts': null_counts,
        'Yes_Counts': yes_counts,
        'No_Counts': no_counts,
        'Total': total_count
    }
    
    # Append the dictionary to the result_data list
    result_data.append(result_dict)

# Create a new DataFrame from the list of dictionaries
result_df = pd.DataFrame(result_data)

# Display the result DataFrame
print(result_df)
vawmfj5a

vawmfj5a3#

使用another answer中提供的示例数据

df = df.groupby('Division').Question.value_counts().unstack()
df['Total'] = df.sum(axis=1)

print(df)

Question   No  Yes  nan  Total
Division                      
name1     2.0  1.0  1.0    4.0
name2     1.0  1.0  NaN    2.0
name20    1.0  1.0  1.0    3.0

相关问题