Как я могу получить желаемый результат ниже состояния в Python? - PullRequest
0 голосов
/ 21 июня 2020

Как я могу создать одну строку и получить тип данных, максимальную длину столбца и количество для каждого столбца фрейма данных, как показано в нижнем желаемом разделе вывода.

import pandas as pd

table = 'sample_data'
idx=0


#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,'NULL',40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65]),
   'new_column':pd.Series([])
}

#Create a DataFrame using above data
sdf = pd.DataFrame(d)

#Create a summary description
desired_data = sdf.describe(include='all').T
desired_data = desired_data.rename(columns={'index':'Variable'})
#print(summary)

#Get Data Type
dtype = sdf.dtypes
#print(data_type)

#Get total count of records (need to work on)
counts = sdf.shape[0] # gives number of row count

#Get maximum length of values
maxcollen = []
for col in range(len(sdf.columns)):
    maxcollen.append(max(sdf.iloc[:,col].astype(str).apply(len)))
#print('Max Column Lengths ', maxColumnLenghts)


#Constructing final data frame
desired_data = desired_data.assign(data_type = dtype.values)
desired_data = desired_data.assign(total_count = counts)
desired_data = desired_data.assign(max_col_length = maxcollen)

final_df = desired_data

final_df = final_df.reindex(columns=['data_type','max_col_length','total_count'])
final_df.insert(loc=idx, column='table_name', value=table)


final_df.to_csv('desired_data.csv')
#print(final_df)

Вывод приведенного выше кода: enter image description here

The desired output I am looking for is : введите описание изображения здесь

In : sdf
Out:
table_name     Name_data_type   Name_total_count  Name_max_col_length Age_data_type   Age_total_count  Age_max_col_length     Rating_data_type   Rating_total_count  Rating_max_col_length
sample_data    object           12                6                   object          12                4                     float64            12                  4

Если вы заметили, я хочу напечатать одну строку, в которой я создаю имя_столбца_тип_данных, имя_столбца_общее_счетчик, имя_столбца_max_col_length и получаю соответствующие значения для них.

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Можете ли вы попробовать это:

Приведенный ниже код пытается перебрать весь фрейм данных, поэтому это может занять некоторое время. Это не оптимальное решение, но рабочее решение для указанной выше проблемы.

from collections import OrderedDict

## storing key-value pair
result_dic = OrderedDict()
unique_table_name = final_df["table_name"].unique()
# remove unwanted rows
final_df.drop("new_column", inplace=True)
cols_name = final_df.columns
## for every unique table name, generating row
for unique_table_name in unique_table_name:
    result_dic["table_name"] = unique_table_name
    filtered_df = final_df[final_df["table_name"] == unique_table_name]
    for row in filtered_df.iterrows():        
        for cols in cols_name:
            if cols != "table_name":
                result_dic[row[0]+"_"+cols] = row[1][cols]

Преобразование dict в фрейм данных

## convert dataframe from dict
result_df = pd.DataFrame([result_dic])
result_df

ожидаемый результат:

table_name  Name_data_type  Name_max_col_length     Name_total_count    Age_data_type   Age_max_col_length  Age_total_count     Rating_data_type    Rating_max_col_length   Rating_total_count
0   sample_data     object  6   12  object  4   12  float64     4   12
0 голосов
/ 21 июня 2020

Вот решение:

df = final_df
df = df.drop("new_column").drop("table_name", axis=1)
df = df.reset_index()
df.melt(id_vars=["index"]).set_index(["index", "variable"]).sort_index().transpose()

Результат:

index          Age                                 Name                 \
variable data_type max_col_length total_count data_type max_col_length  ... 
value       object              4          12    object              6  ... 
...