python - 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
我已经提取了这些列的索引,包括前导 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()
它们的频率出现百分比计算我想要的结果应该是:
index ---->频率 ---> 百分比
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 链接
解决方案
创建一个从索引命名的新列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
推荐阅读
- javascript - THREE.js FBXLoader 将 .png 视为 .psd,并且不加载素材
- r - 类中的R Setter方法
- c++ - 变量值自动改变
- c++ - 如何使用堆分配进行运算符++重载
- firebase - 从包装 Express 应用程序的函数请求静态 *.js 文件时出现 502 错误
- javascript - 如何将脚本标签/JS作为文本附加到文本区域(不可执行)
- c++ - 逗号的左操作数无效 vs 逗号的右操作数无效
- formal-verification - 证明基本算术性质
- python - 重新训练 Mobilenet_SSD KeyError: 'eval_input_fns'
- python - 如何替换缺少的列值?