在Pandas DataFrame中,如果每行的值与某个字符匹配,如何递增每行的值

trnvg8h3  于 2023-05-12  发布在  其他
关注(0)|答案(2)|浏览(169)

这个问题有点类似,但有点复杂。
假设我有这张table:

data = {'column1': ['A1', 'A1', 'A1', 'A1'],
        'column2': ['A9', 'A1', 'A8', 'A1'],
        'column3': ['D1', 'D1', 'D1', 'D1'],
        'column4': ['A6', 'A2', 'A3', 'A4'],
        'column5': ['H1', 'H1', 'H1', 'H1'],
        'column6': ['A4', '', '', 'A3'],
        'column7': ['A5', '', '', 'A9']}

df = pd.DataFrame(data)

+---------+---------+---------+---------+---------+---------+---------+
| column1 | column2 | column3 | column4 | column5 | column6 | column7 |
+---------+---------+---------+---------+---------+---------+---------+
| A1      | A9      | D1      | A6      | H1      | A4      |  A5     |
| A1      | A1      | D1      | A2      | H1      |         |         |
| A1      | A8      | D1      | A3      | H1      |         |         |
| A1      | A1      | D1      | A4      | H1      | A3      |  A9     |
+---------+---------+---------+---------+---------+---------+---------+

这里我的目标是重置每行包含“A”的所有值的数字对应物,从A1开始。如果“A1”在同一行中再次出现,则移到下一个单元格。此外,不为“A”的值和空白应被忽略。

+---------+---------+---------+---------+---------+---------+---------+
| column1 | column2 | column3 | column4 | column5 | column6 | column7 |
+---------+---------+---------+---------+---------+---------+---------+
| A1      | A2      | D1      | A3      | H1      | A4      | A5      |
| A1      | A1      | D1      | A2      | H1      |         |         |
| A1      | A2      | D1      | A3      | H1      |         |         |
| A1      | A1      | D1      | A2      | H1      | A3      | A4      |
+---------+---------+---------+---------+---------+---------+---------+
apeeds0o

apeeds0o1#

试试这个:

import numpy as np
import pandas as pd
df = pd.DataFrame({
    'a': ['A1', 'A1', 'A2', 'B1', 'A8'],
    'b': ['A1', 'A2', 'A4', 'D1', 'A9']
}).T
print(df, '\n')

def f(x):
  return np.insert(
      np.where(
      (x[1:].str[0] != 'A') | (x[1:].str[1:].values == x[:-1].str[1:].values) ,
      x[1:],
      'A' + (x[:-1].str[0]=='A').astype(int).cumsum().astype(str)
      ), 0, x.values[0])

df2 = df.copy()
df2.iloc[:] = np.vstack(df.apply(f, axis=1))
print(df2)

>>    0   1   2   3   4
a  A1  A1  A2  B1  A8
b  A1  A2  A4  D1  A9 

    0   1   2   3   4
a  A1  A1  A2  B1  A3
b  A1  A1  A2  D1  A3
6jjcrrmo

6jjcrrmo2#

如果我记得你有一个similar question,你可以使用类似的cumsum逻辑和掩码:

# identify Ax cells that are not A1
m = df.apply(lambda c: c.str.startswith('A') & c.ne('A1'))

# perform the cumsum, only assign to the above mask
df[m] = m.cumsum(axis=1).add(1).astype(str).radd('A')

输出:

column1 column2 column3 column4 column5 column6 column7
0      A1      A2      D1      A3      H1      A4      A5
1      A1      A1      D1      A2      H1                
2      A1      A2      D1      A3      H1                
3      A1      A1      D1      A2      H1      A3      A4

相关问题