使用 Python 将索引设置为 csv 文件中的重复行值组

Posted

技术标签:

【中文标题】使用 Python 将索引设置为 csv 文件中的重复行值组【英文标题】:Set index to group of repetitive row values in a csv file using Python 【发布时间】:2019-10-15 18:33:33 【问题描述】:

我是 python 新手。我想为每个组重复的特定行元素集设置索引。 我的数据框:

data_dict ='0_deg': [2, 11, 21, -17, 5, 40, 22, 7, 20, -6, -6, -6, 24, 21, 20, 61, 21, 5, 2, 17], 
 '10_deg': [12, -21, 11, 1, 4, -2, 33, 53, 18, 10, -3, -1, 23, 18, 23, 8, 11, -25, 21, -14], 
 '20_deg': [23, -10, 3, 20, -41, 13, 10, 5, -9, 7, -4, -21, 14, -26, -31, 9, 1, -15, 3, -6], 
 '30_deg': [12, 9, -5, 4, 9, -46, 1, -8, -27, 3, -9, -14, 15, -6, 14, 7, -11, 5, 19, -4]
data_dict = pd.read_csv('Dataset.csv')
data_dict = data_dict.set_index('Indexes')

#row idx of a group in this list
idx =[4,10,37,109,133]

这里创建了一个列表作为 idx 并且索引值是手动写入的。

但是对于每组 1000 多个索引(随机值)的更大矩阵,这将是一项非常困难的任务。

我想要的是,当我读取 CSV 文件时,应该选择该行中的第一个值,直到相同的值出现在同一个索引中,它应该被视为 1 组,并且第 1 组的索引必须存储在 idx

例如:在我的小型数据集版本中,从第一列 Indexes 开始,第一个值,即 4,10,37,109,133 是我的第一组索引。这些值在下一组中以相同的顺序重复。 只有它们不应该在代码中手动输入。下一个4 发生时应考虑一个组。因此索引值 4 到 133 必须被视为 idx 下的 1 组。这是因为我需要 idx 来获取更多代码。

我的实际数据集每组有 1000 多个索引值。所以 idx 必须自动获取一个组的所有值。

# getting some dimensions and sorting the data
row_idx_length = len(idx) 
group_length = len(data_dict['0_deg'])
number_of_groups = len(data_dict.keys())  
idx = idx*number_of_groups   
data_arr = np.zeros((group_length,number_of_groups),dtype=np.int32) 

【问题讨论】:

最后一组是否可能在重复索引中缺少某些值? 【参考方案1】:

我相信您需要numpy.tile 整数除法来计算重复次数:

df.index = np.tile(idx, len(df.index) // len(idx))

但如果出现错误(NM 是一些整数):

ValueError:长度不匹配:预期轴有 N 个元素,新值有 M 个元素

这意味着在最后一组中缺少一些元素,因此通过1添加下一组并按index of DataFrame的长度过滤:

#added 150 to idx list
idx =[4,10,37,109,133,150]
df.index = np.tile(idx, len(df.index) // len(idx) + 1)[:len(df.index)]
print (df)          
     0_deg  10_deg  20_deg  30_deg
4        2      12      23      12
10      11     -21     -10       9
37      21      11       3      -5
109    -17       1      20       4
133      5       4     -41       9
150     40      -2      13     -46
4       22      33      10       1
10       7      53       5      -8
37      20      18      -9     -27
109     -6      10       7       3
133     -6      -3      -4      -9
150     -6      -1     -21     -14
4       24      23      14      15
10      21      18     -26      -6
37      20      23     -31      14
109     61       8       9       7
133     21      11       1     -11
150      5     -25     -15       5
4        2      21       3      19
10      17     -14      -6      -4

【讨论】:

每组有 1000 多个元素。那么如何为 idx 动态设置它们?我不想手动创建像 idx=[4,10,37,109,133,150] 这样的列表 @anky_91 - 嗯,很难的问题,但如果很多元素 numpy 应该更快。 @AkshayK。 - 计数idx 怎么样? 在我的一个数据框中,索引以值4 开头,如图所示。在另一种情况下,它可能以其他值开始。但是无论值是什么,它都会对每个组重复,每个组的索引范围也是固定的。例如。从 4 到 ```133`` 元素是固定的。 @AkshayK。 - 不确定是否理解,idx 的解析值还有很多其他 DataFrames?如果可能的话,您可以在新问题中创建minimal, complete, and verifiable example 吗?【参考方案2】:

如果我正确理解您的问题,您需要实际获取 idx 给定的数据框和索引设置。

data_dict ='0_deg': [2, 11, 21, -17, 5, 40, 22, 7, 20, -6, -6, -6, 24, 21, 20, 61, 21, 5, 2, 17], 
 '10_deg': [12, -21, 11, 1, 4, -2, 33, 53, 18, 10, -3, -1, 23, 18, 23, 8, 11, -25, 21, -14], 
 '20_deg': [23, -10, 3, 20, -41, 13, 10, 5, -9, 7, -4, -21, 14, -26, -31, 9, 1, -15, 3, -6], 
 '30_deg': [12, 9, -5, 4, 9, -46, 1, -8, -27, 3, -9, -14, 15, -6, 14, 7, -11, 5, 19, -4]
import pandas as pd
df = pd.DataFrame(data_dict)

idx =[4,10,37,109,133]
df.index = idx * (len(df)//len(idx))

print(df)
#Output:
     0_deg  10_deg  20_deg  30_deg  groups
4        2      12      23      12       1
10      11     -21     -10       9       1
37      21      11       3      -5       1
109    -17       1      20       4       1
133      5       4     -41       9       1
4       40      -2      13     -46       2
10      22      33      10       1       2
37       7      53       5      -8       2
109     20      18      -9     -27       2
133     -6      10       7       3       2
4       -6      -3      -4      -9       3
10      -6      -1     -21     -14       3
37      24      23      14      15       3
109     21      18     -26      -6       3
133     20      23     -31      14       3
4       61       8       9       7       4
10      21      11       1     -11       4
37       5     -25     -15       5       4
109      2      21       3      19       4
133     17     -14      -6      -4       4

设置完成后,您只需计算第 0 个值重复的位置。您可以直接计算它,但为进一步计算增加一列也许更有用。

temp = df.index == df.index[0]
groups = temp.cumsum()
idx_out = list(df.index[groups == 1])

print(idx_out) #[4, 10, 37, 109, 133]

#Optional:

df['groups'] = groups #can be very useful for aggregations and groupby calculations

【讨论】:

在您的代码中,您为索引idx=[4,10,37,109,133] 创建了一个列表。是否有可能,而不是输入所有值,只输入第一个值,例如4 ,以便 idx 将存储从 4 开始的第一列的值,直到下一个 4 出现在该列中? 您能否详细说明“idx 将存储从 4 开始的第一列的值,直到该列中出现下一个 4”?我的印象是您已经“获取”了这样的索引,而我最初的 idx 只是“设置”的一部分。您还没有获得某种重复的索引吗? 我以相同的间隔得到重复,但这只是 5 个索引值的情况,我的原始数据集有 5000 个值,所以 4 会在 5000 个奇数值后重复.那么如何为这种情况指定idx=[]呢? 您当前的问题是否很好地代表了您的需求?我对你的理解是否正确? @AkshayK。

以上是关于使用 Python 将索引设置为 csv 文件中的重复行值组的主要内容,如果未能解决你的问题,请参考以下文章

使用python将句子中的每个单词替换为单词索引

Python pandas数据框“日期”索引xlsx和csv中的不同格式

pandas读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用reset_index函数把行索引重置为列数据(level参数设置将原行索引中的指定层转化为列数据)

pandas读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用reset_index函数把行索引重置为列数据(level参数设置将原行索引中的指定层转化为列数据)

pandas读取csv数据使用reset_index函数把行索引重置为列数据(level参数设置将原行索引中的指定层转化为列数据设置drop参数则删除转化后的数据列)

pandas读取csv数据使用reset_index函数把行索引重置为列数据(level参数设置将原行索引中的指定层转化为列数据设置drop参数则删除转化后的数据列)