Как сгенерировать сводную таблицу Python для подсчета количества строк в ячейках Pandas? - PullRequest
0 голосов
/ 21 июня 2019

У меня возникли проблемы с созданием сводной таблицы в Python 3.7.3 количества строк, найденных в кадре данных (df1), и выравнивания количества по столбцам значений строк в другом кадре данных (df2). Как мне заполнить мой второй фрейм данных общим количеством заголовков столбцов (строк) на основе значений в df1?

У меня есть датафрейм (df1) из 145 столбцов. Они названы «Безымянный: 0» - «Безымянный: 144». В пределах «Безымянный: 0» находится неуникальный список имен, и затем каждый столбец за его пределами содержит строковые значения, которые повторяются по всему фрейму данных. Мне удалось создать второй фрейм данных (df2), который содержит столбец «имя» с уникальными значениями имени из «Безымянный: 0». Он также содержит около 80 других столбцов, которые являются уникальными значениями, найденными в «Безымянный: 1» - «Безымянный: 144» из df1. Ниже вы увидите мои шаги, а также образцы фреймов данных (поскольку я не собираюсь публиковать df из 145 столбцов) того, с чем я работаю, и ожидаемого результата. Любая помощь всегда ценится.

#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, но это не сработало. Я также попробовал команду pivot_table для панд, но я продолжаю получать таблицу, которая только подсчитывает, сколько раз имя появляется. Я даже пытался создать два огромных повторяющихся массива в порядке индекса и использовать функцию pivot_table, но это тоже не сработало.

Ответы [ 2 ]

1 голос
/ 21 июня 2019

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
0 голосов
/ 21 июня 2019

Это просто с 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
...