将列分组并相应地填充

2024-06-16 10:06:08 发布

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

我有一个可以有大量列的数据帧。每列的名称是3个相同的字符,后跟第四个唯一的字符。我试图查看每个列的“组”,以确定它们是否为“-”。如果为空,我只想用“X”填充每列中的每个元素

前测向:

aaa1 aaa2 aaa3 aaa4 bbb1 bbb2 bbb3 bbb4 ccc1 ccc2 ddd1 ggg1 ggg6 ggg8 fff9
 -     -   -    -     1    x   a     -    c   -    a     3    -    -    - 
 -     -   -    -     s    z   1     a    2   -    -     -    -    h    - 
 -     -   -    -     -    x   i     -    c   -    a     3    -    -    - 
 -     -   -    -     -    -   -     -    -   f    -     2    -    2    - 

在本例中,有两个“空白”组—aaa、fff

结果df如下:

aaa1 aaa2 aaa3 aaa4 bbb1 bbb2 bbb3 bbb4 ccc1 ccc2 ddd1 ggg1 ggg6 ggg8 fff9
 X     X   X    X     1    x   a     -    c   -    a     3    -    -    X 
 X     X   X    X     s    z   1     a    2   -    -     -    -    h    X 
 X     X   X    X     -    x   i     -    c   -    a     3    -    -    X 
 X     X   X    X     -    -   -     -    -   f    -     2    -    2    X

我失去的部分是如何将列作为组进行比较。任何想法都会有帮助。你知道吗


Tags: 字符aaa1ccc1aaa2bbb2ggg1aaa3bbb1
3条回答
# Set comprehension to get each group.
col_groups = {col[:3] for col in df}  
# Dictionary comprehension to get the related columns for each group.
col_groups = {group: [c for c in df if c.startswith(group)] 
              for group in col_groups}
# >>> col_groups
# {'bbb': ['bbb1', 'bbb2', 'bbb3', 'bbb4'],
#  'ggg': ['ggg1', 'ggg6', 'ggg8'],
#  'aaa': ['aaa1', 'aaa2', 'aaa3', 'aaa4'],
#  'fff': ['fff9'],
#  'ccc': ['ccc1', 'ccc2'],
#  'ddd': ['ddd1']}

# Set the column values to `X` where all the values for each column in the group equals `-`.
for cols in col_groups.values():
    if df[cols].eq('-').all().all():
        df.loc[:, cols] = 'X'
>>> df
  aaa1 aaa2 aaa3 aaa4 bbb1 bbb2 bbb3 bbb4 ccc1 ccc2 ddd1 ggg1 ggg6 ggg8 fff9
0    X    X    X    X    1    x    a    -    c    -    a    3    -    -    X
1    X    X    X    X    s    z    1    a    2    -    -    -    -    h    X
2    X    X    X    X    -    x    i    -    c    -    a    3    -    -    X
3    X    X    X    X    -    -    -    -    -    f    -    2    -    2    X

col_groups

尝试groupbyfilter.loc赋值

m = df.groupby(df.columns.str[:3], axis=1).filter(lambda x: x.eq('-').all(None))
df.loc[:, m.columns] = 'X'

Out[305]:
  aaa1 aaa2 aaa3 aaa4 bbb1 bbb2 bbb3 bbb4 ccc1 ccc2 ddd1 ggg1 ggg6 ggg8 fff9
0    X    X    X    X    1    x    a    -    c    -    a    3    -    -    X
1    X    X    X    X    s    z    1    a    2    -    -    -    -    h    X
2    X    X    X    X    -    x    i    -    c    -    a    3    -    -    X
3    X    X    X    X    -    -    -    -    -    f    -    2    -    2    X

你可以试试这个:

idx = (df == '-').groupby(df.columns.str[:3], axis=1).all().all().loc[lambda x: x].index
u_cols = df.columns[df.columns.str[:3].isin(idx)]
df.loc[:, u_cols] = 'X'
print(df)

输出:

  aaa1 aaa2 aaa3 aaa4 bbb1 bbb2 bbb3 bbb4 ccc1 ccc2 ddd1 ggg1 ggg6 ggg8 fff9
0    X    X    X    X    1    x    a    -    c    -    a    3    -    -    X
1    X    X    X    X    s    z    1    a    2    -    -    -    -    h    X
2    X    X    X    X    -    x    i    -    c    -    a    3    -    -    X
3    X    X    X    X    -    -    -    -    -    f    -    2    -    2    X

详情:

  1. 首先创建一个布尔矩阵;元素等于“-”时为True。你知道吗
  2. 按列的前三个字符对列进行分组 标题。你知道吗
  3. 使用all检查列中的所有值是否为真。你知道吗
  4. 使用这些all True系列中的索引来筛选列标题 更新数据帧。你知道吗
  5. loc与筛选的datacolumn一起使用,并指定“X”。你知道吗

相关问题 更多 >