0-9在一个数据帧的索引的最左边数字重复多久?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0-9在一个数据帧的索引的最左边数字重复多久?相关的知识,希望对你有一定的参考价值。

我想知道我们是否可以计算在某些熊猫数据帧的index的最左边数字中0-9重复的频率:

             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)

我不确定here的答案可以通过在最左边的数字索引上应用(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()计算频率发生率的百分比我的欲望结果应该是这样的:

index ---->频率--->百分比 000 ----> 0:6次----> 0:总计75% 010 ----> 1:2次----> 1:总计25% 020 ----> 2:0次----> 2:0%总计 040 ----> 3:0次----> 3:0% 050 ----> 4:0次----> 4:0% 060 ----> 5:0次----> 5:0% 130 ----> 6:0次----> 6:0% 180 ----> 7:0次---->总共7:0%

以下是我的数据集示例:dataset sample DL link

答案

从索引创建一个名为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

以上是关于0-9在一个数据帧的索引的最左边数字重复多久?的主要内容,如果未能解决你的问题,请参考以下文章

HDU-4550 卡片游戏

如何在给定范围内创建一个随机打乱数字的 int 数组 [重复]

使用来自另一个数据帧的代码重新索引数据帧

水平对齐两个div(一个在最左边,另一个在容器的最右边)[重复]

MySQL只能使用定义索引的最左边部份

合并具有不同索引的两个数据帧,同时使用一行代码保留主数据帧的索引