首页 > 解决方案 > 在python中加入数据框列

问题描述

我有一个名为 X 的数据框

X有 3 列(Uni、Sub、Colors

Uni 是字符串,Sub 是字符串

但 Colors 是一个字符串数组

X 中的数据如下所示

Uni     Sub      Colours
-----   ------   -------
Melb    Math     (Red, Blue, Green)
Melb    English  (Yellow, Blue, Brown, White)
Sydney  Math     (Green, Pink, Red, White, Black)
Sydney  Art      (White, Pink)
Sydney  Med      (Yellow, Red, Pink, Brown, White, Black, Green)
Ottawa  Math     (Blue, Yellow)
Ottawa  Physics  (Red, Orange, Black)

我正在尝试将这些列加入一个字符串中,以便将其传递给 SQL 存储过程

我想要的结果应该是这样的

Melb;Math;Red, Blue, Green|Melb;English;Yellow, Blue, Brown, White|Sydney;Math;Green, Pink, Red, White, Black| ...

其中列用分号分隔;和由条分隔的行|

我有这个代码

MyString = X[['Uni', 'Sub', 'Colours']].apply(lambda x: ';'.join(x), axis = 1)

但我收到了这个错误

类型错误:序列项 2:预期的 str 实例,找到元组

所以我把它改成了这个

X["Codes"] = ",".join(map(str, X["Codes"]))
MyString = X[['PtsID', 'VisitID', 'Codes']].apply(lambda x: ';'.join(x), axis = 1)

但最终结果不是我想要的,因为它是一个列表,看起来像这样

Melb    Math     Red\n1    Blue\n2    Green\n3
Melb    English     Yellow\n1    Blue\n2    Brown\n3    White\n4
.
.
.

知道如何为单个字符串获得所需的格式吗?

标签: pythonarraysdataframe

解决方案


考虑df

In [346]: df = pd.DataFrame({'Uni':['Melb', 'Melb', 'Sydney', 'Sydney'], 'Sub':['Math', 'English', 'Math', 'Art'], 'Colours':[('Red', 'Blue', 'Green'), ('Yellow', 'Blue', 'Brown', 'White'), ('Green', 'Pink', 'Red', 'White', 'Black'), ('White', 'Pink')]})
     ...: 

In [347]: df
Out[347]: 
      Uni      Sub                           Colours
0    Melb     Math                (Red, Blue, Green)
1    Melb  English      (Yellow, Blue, Brown, White)
2  Sydney     Math  (Green, Pink, Red, White, Black)
3  Sydney      Art                     (White, Pink)

df.agg与 一起使用Series.str.cat

In [350]: df.Colours = df.Colours.apply(lambda x: ','.join(x))

In [352]: ans = df.agg(';'.join, 1).str.cat(sep='|')

In [353]: ans
Out[353]: 'Melb;Math;Red,Blue,Green|Melb;English;Yellow,Blue,Brown,White|Sydney;Math;Green,Pink,Red,White,Black|Sydney;Art;White,Pink'

推荐阅读