Pandas数据框中某集合的列次序变化的确定

2024-09-30 02:21:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常大的csv文件,其结构如下:

  a1  b1  c1 a2 b2 c2 a3 b3 c3 ..... a999 b999 c999    
0 5   4   2  3  2  2  6  7  9  ....................
1 2   1   4  4  6  9  3  5  9  ....................
.
.

我要做的是将a、b和c的列按N的集合进行分组,并在每一行中检查集合的最大值(argmax)的索引何时更改。你知道吗

所以在上面的例子中,对于N=3,a1,b1,c1是第0行的第一个集合,argmax是0,第二个集合是a2,b2,c2,argmax仍然是0,第三个集合是a3,b3,c3,但是现在argmax是2。我确实在寻找一个脚本,它解析整个csv文件并返回[c3,c1]。c3,因为argmax在第0行和c1行中变化,因为argmax在第1行中没有变化,但c1是该集合中的最大值。你知道吗

我现在用两个for循环来做这个,它很慢而且看起来很难看,有没有更好的熊猫Python方法呢?我觉得一定有。你知道吗


Tags: 文件csva2a1结构b2a3b1
2条回答

我尽量保持代码尽可能简单。您可以按切片列名转换数据帧和组:

df = df.T.reset_index()
idx = df.groupby(df['index'].str.slice(1,2)).idxmax()

输出:

       0  1
index      
1      0  2
2      3  5
3      8  8

这意味着对于第0行,组1的最大值在索引0处,组2的最大值在索引3处(或者,0表示取mod 3),组3的最大值在索引8处(如果取mod 3,则为2)。第1行的读数相同:)

如果需要实际列名:

df.columns[idx.values.flatten(order='F')]

输出:

['a1', 'a2', 'c3', 'c1', 'c2', 'c3']

您可以groupby列集合,并使用.idxmax查找每个集合中出现最大值的列。你可以找到第一个字母变化的地方(如果有)来得到你的列表。你知道吗

n = 3
df2 = df.groupby([x//n for x in range(len(df.columns))], axis=1).idxmax(1)

mask = df2.applymap(lambda x: x[0])  # Case of 1-letter column prefix
## If possibility of words with different length ending in digits try
# import string 
# mask = df2.applymap(lambda x: x.strip(string.digits))

df2.lookup(df2.index, 
           (mask.ne(mask.shift(-1, axis=1)).idxmax(1)+1) % (len(mask.columns))).tolist()

样本数据

print(df)
   a1  b1  c1  a2  b2  c2  a3  b3  c3
0   5   4   2   3   2   2   6   7   9
1   2   1   4   4   6   9   3   5   9
2   2   1   4  10   6   9   3   5   9
3   2   1   4   1   6   9   3  10   9

n = 3
df2 = df.groupby([x//n for x in range(len(df.columns))], axis=1).idxmax(1)
print(df2)
#    0   1   2
#0  a1  a2  c3
#1  c1  c2  c3
#2  c1  a2  c3
#3  c1  c2  b3

mask = df2.applymap(lambda x: x[0])
df2.lookup(df2.index, (mask.ne(mask.shift(-1, axis=1)).idxmax(1)+1) % (len(mask.columns))).tolist()
#['c3', 'c1', 'a2', 'b3']

相关问题 更多 >

    热门问题