如何将dataframe字符串列拆分为两列?

我有一个包含一列(字符串)的数据框,我想将其拆分为两列(字符串),其中一列标题为“fips”,另一列标题为“'row”

我的数据帧df如下所示:

行
百万美元
1 01000阿拉巴马州
2 01001阿拉巴马州奥托加县
3 01003阿尔卑斯州鲍德温县
4 01005阿拉巴马州巴布尔县

我不知道如何使用df.row.str[:]来实现拆分行单元格的目标。我可以使用df['fips']=hello添加一个新列并用hello填充它。有什么想法吗

fips行
百万美元
1 01000阿拉巴马州
2 01001阿拉巴马州奥托加县
3 01003阿尔卑斯州鲍德温县
4 01005阿拉巴马州巴布尔县

TL;DR版本:

对于以下简单情况:

  • 我有一个带分隔符的文本列,我想要两列

最简单的解决方案是:

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

如果字符串的拆分数目不一致,并且希望None替换缺少的值,则必须使用expand=True

请注意,在这两种情况下,.tolist()方法都不是必需的。两者都不是zip()

详细内容:

Andy Hayden的解决方案在演示str.extract()方法的威力方面表现得非常出色

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

&gt&燃气轮机&燃气轮机;作为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_分割
0 A1-B1[A1,B1]
1 A2-B2[A2,B2]

1:如果您不确定.str.split()的前两个参数的作用,
我推荐使用纯Python版本的文档。

但你如何从:

  • 包含两个元素列表的列

致:

  • 两列,每列包含列表的各个元素

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

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

&gt&燃气轮机&燃气轮机;上下数据帧({quot;U":[quot;A",“B",“C"]))
&燃气轮机&燃气轮机&燃气轮机;上下
U
0 A
1b
2 C
&燃气轮机&燃气轮机&燃气轮机;上下方向[“L”]=上下方向[“U”]街下()
&燃气轮机&燃气轮机&燃气轮机;上下
乌尔
0 A A
1 B B
2c

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

&gt&燃气轮机&燃气轮机;df['AB'].str[0]
0 A
1A
名称:AB,数据类型:object
&燃气轮机&燃气轮机&燃气轮机;df['AB'].str[1]
0    1
1    2
名称:AB,数据类型:object

当然,.str的这个索引接口并不关心它所索引的每个元素是否实际上是一个字符串,只要它可以被索引,因此:

&gt&燃气轮机&燃气轮机;df['AB'].str.split('-',1.str[0]
0 A1
1 A2
名称:AB,数据类型:object
&燃气轮机&燃气轮机&燃气轮机;df['AB'].str.split('-',1.str[1]
0 B1
1 B2
名称:AB,数据类型:object

然后,只需利用iterables的Python元组解包就可以了

&gt&燃气轮机&燃气轮机;df['A'],df['B']=df['AB'].str.split('-',1).str
&燃气轮机&燃气轮机&燃气轮机;df
A B_分开A B
0 A1-B1[A1,B1]A1 B1
1 A2-B2[A2,B2]A2-B2

当然,从拆分字符串列中获取数据帧非常有用,.str.split()方法可以使用expand=True参数为您完成此操作:

&gt&燃气轮机&燃气轮机;df['AB'].str.split('-',1,expand=True)
0   1
0 A1 B1
1 A2 B2

因此,实现我们想要的另一种方式是:

&gt&燃气轮机&燃气轮机;df=df[['AB']]
&燃气轮机&燃气轮机&燃气轮机;df
AB
0 A1-B1
1 A2-B2
&燃气轮机&燃气轮机&燃气轮机;join(df['AB'].str.split('-',1,expand=True)。重命名(列={0:'A',1:'B'}))
AB A B
0 A1-B1 A1 B1
1 A2-B2 A2-B2

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

&gt&燃气轮机&燃气轮机;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('-'))
回溯(最近一次呼叫最后一次):
[...]    
ValueError:值的长度与索引的长度不匹配
&燃气轮机&燃气轮机&燃气轮机;

但是expand=True通过将None放在没有足够数据的列中,很好地处理了它;“拆分”:

&gt&燃气轮机&燃气轮机;加入(
…df['AB'].str.split('-',expand=True)。重命名(
…列={0:'A',1:'B',2:'C'}
...     )
... )
AB A B C
0 A1-B1 A1-B1无
1 A2-B2 A2-B2无
2 A3-B3-C3 A3-B3-C3

发表评论