如何在Pandas单元格中生成Python数据透视表,该表包含字符串计数?

时间:2019-06-21 20:19:43

标签: python pandas pivot-table

我无法在Python 3.7.3中创建在数据帧(df1)中找到的字符串计数的数据透视表,并使计数与另一个数据帧(df2)中的字符串值的列对齐。如何根据df1中的值用列标题(字符串)的总数填充第二个数据帧?

我有145列的数据框(df1)。它们被命名为“未命名:0”-“未命名:144”。在“未命名:0”中,是一个非唯一的名称列表,然后超出范围的每一列都包含在整个数据帧中重复的字符串值。我已经能够创建第二个数据框(df2),其中包含一个“名称”列,其名称的唯一值来自“未命名:0”。它还包含约80个其他列,它们是df1的“未命名:1”-“未命名:144”中的唯一值。在下面,您将看到我所使用的步骤以及预期的输出以及示例数据帧(因为我不会在145列df上发布)。任何帮助总是感激不尽。

#imported df1 using pandas
df1 = pd.read_excel('path/to/file')

## Creation of df2
#created a temporary df
tmp_df = df1.drop(columns = ['Unnamed: 0'])

array = tmp_df['Unnamed: 1'] #created array to find unique values from df1
for col in tmp_df.columns:
    array = array.append(tmp_df[col]).reset_index(drop = True)

#created unique value arrays for name and the df1 values
array2 = array.unique()
names = df['Unnamed: 0'].unique()

#Create temp dfs to build df2
names_df = pd.DataFrame(names)
names.columns = ['name']
strvals_df = pd.DataFrame(columns = array2)
df2 = pd.concat([names_df.reset_index(drop=True), strvals_df], axis=1)
df2 = df2.loc[:, df2.columns.notnull()]

示例数据框:

df1
Unnamed: 0  Unnamed: 1  Unnamed: 2  Unnamed: 3  Unnamed: 4  Unnamed: 5
name1       str1        str1        str2        str2        str3
name1       str4        NaN         str3        str1        str4
name1       str1        str1        str2        str2        str3
name2       str4        NaN         str3        str1        str4
name3       str1        str1        str2        str2        str3
name3       str4        NaN         str3        str1        str4
name4       str1        str1        str2        str2        str3

df2 (current)
name    str1    str2    str3    str4
name1   NaN     NaN     NaN     NaN
name2   NaN     NaN     NaN     NaN
name3   NaN     NaN     NaN     NaN   
name4   NaN     NaN     NaN     NaN 

df2 (desired output, counts of str values from df1 in columns)
name    str1    str2    str3    str4
name1   5       4       3       2
name2   1       0       1       2
name3   3       2       2       2   
name4   2       2       1       0

我已经尝试过与嵌套的for循环一起遍历数据帧,但这没有用。我也尝试过对pandas使用pivot_table命令,但是我一直在获取一个表,该表仅计算名称显示的次数。我什至尝试按索引顺序制作两个巨大的重复数组,并使用ivot_table函数,但这也不起作用。

2 个答案:

答案 0 :(得分:1)

stack首先,您不需要df2


m = (df1.set_index('Unnamed: 0').stack()
        .rename_axis(['names', 'values']).rename('columns').reset_index())

m.pivot_table('values', 'names', 'columns', aggfunc='count', fill_value=0)

columns  str1  str2  str3  str4
names
name1       5     4     3     2
name2       1     0     1     2
name3       3     2     2     2
name4       2     2     1     0

答案 1 :(得分:0)

使用str.get_dummies很简单:

df.set_index('Unnamed: 0').stack().str.get_dummies().sum(level=0)


Out[1515]:
                str1  str2  str3  str4
Unnamed: 0
name1          5     4     3     2
name2          1     0     1     2
name3          3     2     2     2
name4          2     2     1     0