Сократите разделенную запятыми строку в df, если все строки идентичны - PullRequest
2 голосов
/ 05 ноября 2019

Пока это мой код

import pandas as pd
from io import StringIO

data = StringIO("""
"name1","hej","7aa","a"
"name1","du","71al","a"
"name1","aj","74a","a"
"name1","oj","7aj","a"
"name2","fin","7ag","a"
"name2","katt","7a","a"
""")
df = pd.read_csv(data, header=0, names=["name","text2","text","as"])
df[['text2','text','as']] = df.groupby(['name']).transform(lambda 
x: ','.join(x))
df = df[['name','text','text2','as']].drop_duplicates()
df

Получает большую часть пути.

df
    name          text     text2     as
0  name1  71al,74a,7aj  du,aj,oj  a,a,a
3  name2        7ag,7a  fin,katt    a,a

Мне просто нужна одна строка для проверки каждого столбца ['text','text2', 'as'], и если все элементы, разделенные запятыми, идентичны, верните только первый

, поэтому результат, который я получаю, равен

df
    name          text     text2     as
0  name1  71al,74a,7aj  du,aj,oj    a
3  name2        7ag,7a  fin,katt    a

, который я пытался применить сТрещина(','). Не могу заставить его работать.

Я добавляю в этот пост первые комментарии. Я не смог правильно описать свою проблему

Если мой df такой:

df
    name          text     text2     as
0  name1  71al,74a,7aj  du,aj,oj  a,b,a
3  name2        7ag,7a  fin,katt    a,a

Мне нужно изменить его на:

df
    name          text     text2     as
0  name1  71al,74a,7aj  du,aj,oj  a,b,a
3  name2        7ag,7a  fin,katt    a

not:

df
    name          text     text2     as
0  name1  71al,74a,7aj  du,aj,oj  a,b
3  name2        7ag,7a  fin,katt    a

Спасибо

Это мое окончательное решение:

data = StringIO("""
"name1","hej","7aa","a"
"name1","du","71al","b"
"name1","aj","74a","a"
"name1","oj","7aj","a"
"name2","fin","7ag","a"
"name2","katt","7a","a"
""")
df = pd.read_csv(data, header=0, names=["name","text2","text","as"])
df[['text2','text','as']] = df.groupby(['name']).transform(lambda x: ','.join(x))
df = df[['name','text','text2','as']].drop_duplicates()
for col in df.columns:
    df[col] = df[col].str.split(',').map(lambda x: ','.join(set(x) if len(set(x)) == 1 else x))
df

Мне пришлось прибегнуть к итерации. Я не мог получить желаемый результат с Agg. Кроме того, если бы кто-то мог объяснить мне, как len (set (x)) == 1 здесь, это было бы очень ценно (должно быть по крайней мере 2 из-за запятой?)

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Попробуйте

df['as'] = df['as'].str.split(',').map(lambda x: ','.join(set(x) if len(set(x)) == 1 else x))
1 голос
/ 05 ноября 2019

Используйте GroupBy.agg с пользовательской лямбда-функцией с if-else:

df = (df.groupby('name')
        .agg(lambda x: ','.join(set(x) if len(set(x)) == 1 else x))
        .reset_index())
print (df)
    name     text2          text     as
0  name1  du,aj,oj  71al,74a,7aj  a,b,a
1  name2  fin,katt        7ag,7a      a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...