У меня есть столбец dataframe, в который вставлен случайный кортеж. Я хотел бы объединить все эти кортежи в одну строку, разделенную ','.

EX

Data      People
 A        XYZ
 B        ABX,LMN
 C       ('OPP', 'GGG')
 D        OAR

Я только пытаюсь «нацелить» здесь кортеж и преобразовать его в строку, дающую следующий фрейм данных:

Data      People
 A        XYZ
 B        ABX,LMN
 C        OPP,GGG
 D        OAR

df['People'] = df['People'].apply(','.join)

Я попробовал это, но в итоге вставлял запятые между каждым символом во всех строках «ОК».

0
MaxB 25 Июн 2019 в 20:55

3 ответа

Лучший ответ

Если вам нужно, вы можете сделать что-то вроде ниже.

df['People'] = df['People'].apply(lambda x: ', '.join(x) if isinstance(x,tuple) else x)

Выход:

  Data  People
0   A   XYZ
1   B   ABX, LMN
2   C   OPP, GGG
3   D   QAR
1
harvpan 25 Июн 2019 в 18:10

Это работает, возможно, не самое элегантное решение:

df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': ['AA', 'ABC, LMN', ('XYZ', 'PQR'), 'OLA']})

# Output

    A   B
0   1   AA
1   2   ABC, LMN
2   3   (XYZ, PQR)
3   4   OLA
df['B'].apply(lambda x: ','.join([val for val in x]) if isinstance(x, tuple) else x)

# Output

0          AA
1    ABC, LMN
2     XYZ,PQR
3         OLA
Name: B, dtype: object
1
piyush daga 25 Июн 2019 в 18:10

Вы можете избежать apply, используя map для создания маски True в tuple. Используйте эту маску для нарезки строк, имеющих кортеж, и используйте str.join прямо на нем.

m = df.People.map(type).eq(tuple)
df.loc[m, 'People'] = df.loc[m, 'People'].str.join(',')


Out[2206]:
  Data   People
0    A      XYZ
1    B  ABX,LMN
2    C  OPP,GGG
3    D      OAR
0
Andy L. 25 Июн 2019 в 18:27