python如何输出两列数据_Python-如何将一列分为两列?

小编典典

对于以下简单情况:

我有一个带有定界符的文本列,我想要两列

最简单的解决方案是:

df['A'], df['B'] = df['AB'].str.split(' ', 1).str

或者,你可以使用以下方法自动为拆分的每个条目创建一个带有一列的DataFrame:

df['AB'].str.split(' ', 1, expand=True)

expand=True如果字符串的分割数不一致,并且要None替换缺失的值,则必须使用。

请注意,无论哪种情况,.tolist()都不需要该方法。都不是zip()。

详细地:

安迪·海登(Andy Hayden)的解决方案最能证明该str.extract()方法的强大功能。

但是对于在已知分隔符上的简单拆分(例如,用破折号拆分或通过空格拆分),该.str.split()方法就足够了1。它对字符串的一列(系列)进行操作,并返回列表的一列(系列):

>>> import pandas as pd

>>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2']})

>>> df

AB

0 A1-B1

1 A2-B2

>>> df['AB_split'] = df['AB'].str.split('-')

>>> df

AB AB_split

0 A1-B1 [A1, B1]

1 A2-B2 [A2, B2]

1:如果不确定.str.split()do 的前两个参数是什么,我建议为该方法的纯Python版本使用docs 。

但是你如何去做:

包含两个元素的列表的列

至:

两列,每列包含列表的相应元素?

好吧,我们需要仔细看看.str列的属性。

这是一个神奇的对象,用于收集将列中的每个元素视为字符串的方法,然后在每个元素中尽可能有效地应用相应的方法:

>>> upper_lower_df = pd.DataFrame({"U": ["A", "B", "C"]})

>>> upper_lower_df

U

0 A

1 B

2 C

>>> upper_lower_df["L"] = upper_lower_df["U"].str.lower()

>>> upper_lower_df

U L

0 A a

1 B b

2 C c

但是它还有一个“索引”接口,用于通过其索引获取字符串的每个元素:

>>> df['AB'].str[0]

0 A

1 A

Name: AB, dtype: object

>>> df['AB'].str[1]

0 1

1 2

Name: AB, dtype: object

当然,.str只要可以对其建立索引,则此索引接口并不真正在乎它所索引的每个元素是否实际上是字符串,因此:

>>> df['AB'].str.split('-', 1).str[0]

0 A1

1 A2

Name: AB, dtype: object

>>> df['AB'].str.split('-', 1).str[1]

0 B1

1 B2

Name: AB, dtype: object

然后,只需利用Python元组对可迭代对象进行拆包即可

>>> df['A'], df['B'] = df['AB'].str.split('-', 1).str

>>> df

AB AB_split A B

0 A1-B1 [A1, B1] A1 B1

1 A2-B2 [A2, B2] A2 B2

当然,从拆分一列字符串中获取一个DataFrame非常有用,以至于该.str.split()方法可以通过expand=True参数为你做到这一点:

>>> df['AB'].str.split('-', 1, expand=True)

0 1

0 A1 B1

1 A2 B2

因此,完成我们想要的工作的另一种方法是:

>>> df = df[['AB']]

>>> df

AB

0 A1-B1

1 A2-B2

>>> df.join(df['AB'].str.split('-', 1, expand=True).rename(columns={0:'A', 1:'B'}))

AB A B

0 A1-B1 A1 B1

1 A2-B2 A2 B2

该expand=True版本虽然较长,但与元组拆包方法相比具有明显的优势。元组解压缩不能很好地处理不同长度的拆分:

>>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2', 'A3-B3-C3']})

>>> df

AB

0 A1-B1

1 A2-B2

2 A3-B3-C3

>>> df['A'], df['B'], df['C'] = df['AB'].str.split('-')

Traceback (most recent call last):

[...]

ValueError: Length of values does not match length of index

>>>

但是expand=True通过放置None没有足够“拆分”的列来很好地处理它:

>>> df.join(

... df['AB'].str.split('-', expand=True).rename(

... columns={0:'A', 1:'B', 2:'C'}

... )

... )

AB A B C

0 A1-B1 A1 B1 None

1 A2-B2 A2 B2 None

2 A3-B3-C3 A3 B3 C3

2020-02-11

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值