python - 如何将外观相似的列合并为一个并在熊猫中为其分配名称?
问题描述
我有一个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
,对于列,看起来像它的列csv
是BQ77a1,BQ77a2,BQ77a3
,对于列MO22
,列csv
是MO22c1,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。
解决方案
试试这个,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
推荐阅读
- javascript - 将带有对象的数组传递给数据表
- laravel - 流明可报告和可渲染异常不起作用
- groovy - 如何在 groovy 中列出一组文件?
- php - 从 wordpress 中的 RSS 提要中删除一个类
- sql - SQL where 函数与 Over Partition 一起使用
- c++ - C++ | 模板和常量类型
- java - 我无法安装 Netbeans10
- css - 带有 CSS 变量的文本阴影
- visual-studio - Visual Studio 2019 中的 Xamarin Live Player
- javascript - 如何从已部署的 Firebase 应用程序的云函数中获取