我有一个包含一列(字符串)的数据框,我想将其拆分为两列(字符串),一列标题为 'fips'
,另一列为 '行'
我的数据框 df
如下所示:
row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
我不知道如何使用 df.row.str[:]
来实现拆分行单元格的目标。我可以使用 df['fips'] = hello
添加一个新列并使用 hello
填充它。有什么想法吗?
fips row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
最佳答案
对于以下简单情况:
最简单的解决方案是:
df[['A', 'B']] = df['AB'].str.split(' ', 1, expand=True)
如果您的字符串具有不均匀的拆分数,并且您希望 None
替换缺失值,则必须使用 expand=True
。
请注意,在任何一种情况下,.tolist()
方法都是不必要的。 zip()
也不是。
Andy Hayden's solution最出色地展示了 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()
的前两个参数是做什么的,
我推荐 plain Python version of the method 的文档.
但是你怎么去:
到:
好吧,我们需要仔细看看列的 .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
但它也有一个“索引”接口(interface),用于通过索引获取字符串的每个元素:
>>> 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
的这个索引接口(interface)并不真正关心它所索引的每个元素是否实际上是一个字符串,只要它可以被索引,所以:
>>> 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
https://stackoverflow.com/questions/14745022/