首页 > 解决方案 > 如何将外观相似的列合并为一个并在熊猫中为其分配名称?

问题描述

我有一个csv如下所示

AB22,AD34,GQ22,BQ77a1,BQ77a2,BQ77a3,CA33,LA21,MO22c1,MO22c4
"ab,vd","va,ca","aa","ba,po,la","ma,na,qa","la,oo,aa","ca","na,la","re,te","ka,lo"
"vb,zr","ra,oa","na","oa,yo,sa","xa,ia,ga","lk,po,za","ja","ka,la","rv,gh","xa,jk"

以上csv只是csv我所拥有的较大版本的较短版本。它有更多的行和更多的列。但是这个例子对我的问题来说已经足够好了。

现在我有一个看起来像这样的列名列表

columns = ["BQ77", "MO22"]

现在我需要查找其中的列,这些列csv看起来像我在列表中的每个列名,并将这些列折叠成一个,在其中我使值以逗号分隔。

例如BQ77,对于列,看起来像它的列csvBQ77a1,BQ77a2,BQ77a3,对于列MO22,列csvMO22c1,MO22c4

现在需要折叠这些列,并且需要将值连接在一起(逗号分隔),并且列名应该是列表中的列columns

所以我csv应该看起来像这样

AB22,AD34,GQ22,BQ77,CA33,LA21,MO22
"ab,vd","va,ca","aa","ba,po,la,ma,na,qa,la,oo,aa","ca","na,la","re,te,ka,lo"
"vb,zr","ra,oa","na","oa,yo,sa,xa,ia,ga,lk,po,za","ja","ka,la","rv,gh,xa,jk"

我创建了列表中给出的列与csv匹配它们的列的映射。所以这就是我所做的

import pandas as pd

columns = ["BQ77", "MO22"]
df = pd.read_excel(io="/Users/souvikray/Downloads/test.xlsx", sheet_name="A1") // file originally is an excel file
headers = df.columns.tolist()
col_map = {}
for column1 in columns:
    for column2 in headers:
        if column1 in column2:
            if col_map.get(column1):
                col_map[column1].append(column2)
            else:
                col_map[column1] = [column2]

所以我得到一个映射

col_map = {"BQ77": ["BQ77a1", "BQ77a2", "BQ77a3"], "MO22": ["MO22c1","MO22c4"]}

现在我不确定如何使用这些信息来折叠看起来相似的列。我也在网上查了一下,发现这个问题Merge multiple column values into one column in python pandas但是这里的列是连续的,但在我的情况下,所需的列出现在某些地方

有什么办法可以做到这一点?

注意:由于我没有发布整个 csv,所以要记住的一件事是列值也可能有 int 和 float。

标签: pythonexcelpandascsv

解决方案


试试这个,df是你的主要数据框

A=[["ab,vd","va,ca","aa","ba,po,la","ma,na,qa","la,oo,aa","ca","na,la","re,te","ka,lo"],
   ["vb,zr","ra,oa","na","oa,yo,sa","xa,ia,ga","lk,po,za","ja","ka,la","rv,gh","xa,jk"]]
df=pd.DataFrame(A ,columns = ["AB22","AD34","GQ22","BQ77a1","BQ77a2","BQ77a3","CA33","LA21","MO22c1","MO22c4"])   
columns = ["BQ77", "MO22"]
for c in columns:
    cc = [i for i in df.columns if i.startswith(c)]
    df[c] = df[cc].apply(','.join, axis=1)
    df=df.drop(columns=cc,axis=1)

输出

AB22   AD34 GQ22 CA33   LA21                        BQ77         MO22
0  ab,vd  va,ca   aa   ca  na,la  ba,po,la,ma,na,qa,la,oo,aa  re,te,ka,lo
1  vb,zr  ra,oa   na   ja  ka,la  oa,yo,sa,xa,ia,ga,lk,po,za  rv,gh,xa,jk

推荐阅读