Как свернуть похожие столбцы в один и присвоить ему имя в pandas? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть 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"]}

Теперь я не уверен, как я могу использовать эту информацию для свертывания похожих столбцов. Я также поискал в Интернете и нашел этот вопрос Объединить несколько значений столбца в один столбец в python pandas, но здесь столбцы непрерывны, но в моем случае необходимые столбцы встречаются в определенных местах

Есть ли способ сделать это?

Примечание: Поскольку я не публиковал весь CSV-файл, следует помнить, что значения столбцов могут иметь int и плавать тоже.

Ответы [ 2 ]

1 голос
/ 26 мая 2020

IIU C, используя join stack и filter

s = df.filter(regex='|'.join(columns)).stack().reset_index()

df1 = df.join(
    s.groupby([s["level_0"], s["level_1"].str[:2]])[0].agg(",".join).unstack(1)
).drop(s["level_1"].unique(), axis=1).rename(columns={'BQ' : 'BQ77', 'MO' : 'MO22' })

print(df1)

    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
1 голос
/ 26 мая 2020

Попробуйте это, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...