Как часто 0-9 повторяются в самой левой цифре индекса одного кадра данных? - PullRequest
0 голосов
/ 17 января 2019

Мне было интересно, можем ли мы посчитать, как часто 0-9 повторяются в самой левой цифре index определенного кадра данных панды:

             A          B           C
0   -56.343656        NaN -418.540483
10  -87.577880 -16.061497         NaN
20         NaN -15.337254         NaN
40  -67.462841        NaN -431.924830
50  -63.377158 -28.260790         NaN
60         NaN -22.996095         NaN
130  11.569845        NaN -307.034737
180  11.398947  -1.793530         NaN

Я извлек индексы тех столбцов, в которых есть nan, включая ведущие 0:

000
010
020
040
050
060
130
180

и попробуйте сохранить извлеченные индексы в CSV-файле. затем я даже попытался снова поместить их в фрейм данных, исходя из того, что этот принцип может быть самой левой цифрой [0-7], вторая самая левая цифра может быть [0-59], а последней может быть [0-9999] и сохраняться в csv файл для дальнейшей обработки только в столбце 'section', который представляет столбец с самой левой цифрой.

Мои сценарии следующие:

import numpy as np
import pandas as pd


df = pd.read_csv('D:\SOF.TXT', header=None)
id_set = df[df.index % 4 == 0].astype('int').values
A = df[df.index % 4 == 1].values
B = df[df.index % 4 == 2].values
C = df[df.index % 4 == 3].values

data = {'A': A[:,0], 'B': B[:,0], 'C': C[:,0]}
#main_data contains all the data
main_data = pd.DataFrame(data, columns=['A','B','C'], index = id_set[:,0])  


main_data[np.isinf(main_data)] = np.nan    # convert inf to nan
main_data_nan = main_data[main_data.isnull().any(axis=1)]   # extract sub data frame
print(main_data_nan)
# to fix 3 digits of index in start
new_index = [str(x).zfill(3) for x in main_data_nan.index]
main_data_nan.index = new_index
#print all data includes nan values in .csv file
main_data_nan.to_csv('nan_data.csv', na_rep='NaN')   # export
#print just especial column that includes nan values in .csv file including id_set or indexes
main_data_nan['C'].to_csv('nan_datatemp.csv', na_rep='NaN')
#print all id_set which is index in data frame has nan values
for i in range(len(main_data_nan)):
    print (main_data_nan.index[i])


dff = pd.read_csv("D:\nan_datatemp.csv")
cycle, section, cell = [], [], []
for i in range(9999):
    for j in range(8):
        for k in range(60):
            cycle.append(i)
            section.append(j)
            cell.append(k)
dfff = {'Section':section, 'Cell':cell, 'Cycle':cycle}
dffff = pd.DataFrame(dfff, columns=['Section','Cell', 'Cycle'], index = id_set[:,0])
dffff.to_csv('exit_id_det.csv', encoding='utf-8', index=False)

Я не уверен, что ответ здесь мог бы выполнить мой ответ, применив (df==X).sum() к крайнему левому разряду, например:

(df==0).sum()
(df==1).sum()
(df==2).sum()
(df==3).sum()
(df==4).sum()
(df==5).sum()
(df==6).sum()
(df==7).sum()

и даже используя main_data_nan.isnull().sum().sum() вычисляя процент частоты появления их Результаты моего желания должны быть такими:

индекс ----> частота ---> процент
0 00 ----> 0: 6 раз ----> 0: всего 75%
0 10 ----> 1: 2 раза ----> 1: всего 25%
0 20 ----> 2: 0 раза ----> 2: 0% в общей сложности
0 40 ----> 3: 0 раза ----> 3: 0% в общей сложности
0 50 ----> 4: 0 раза ----> 4: 0% в общей сложности
0 60 ----> 5: 0 раз ----> 5: 0% в общей сложности
1 30 ----> 6: 0 раз ----> 6: 0% в общей сложности
1 80 ----> 7: 0 раз ----> 7: 0% в общей сложности

Вот мой пример набора данных: Пример набора данных DL link

1 Ответ

0 голосов
/ 17 января 2019

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

import collections

df['index'] = df.index
null_data = df[df.isnull().any(axis=1)]
cycle_left = collections.Counter(null_data['index']//100%10)
cell_left = collections.Counter(null_data['index']//10000%10)
section_left = collections.Counter(null_data['index']//100000%10)

Выводом будет словарь, где клавиши - это самые левые цифры, а значения - частоты для каждой цифры.

Теперь давайте предположим, что у вас есть нулевые значения в индексах 427888, 101, 6123456.

Пример вывода:

Counter({1: 1, 8: 1, 4: 1})     #cycle_left
Counter({2: 2, 0: 1})           #cell_left
Counter({0: 1, 4: 1, 1: 1})     #section_left

Вы также можете использовать .value_counts() на последнем шаге, чтобы получить ряд, содержащий частоты (индекс будет самой левой цифрой, а значение будет частотой этой цифры).

df['index'] = df.index
null_data = df[df.isnull().any(axis=1)]
cycle_left = (null_data['index']//100%10).value_counts()
cell_left = (null_data['index']//10000%10).value_counts()
section_left = (null_data['index']//100000%10).value_counts()

Пример вывода:

#cycle_left
4    1
1    1
8    1
Name: index, dtype: int64

#cell_left
2    2
0    1
Name: index, dtype: int64

#section_left
1    1
4    1
0    1
Name: index, dtype: int64
...