使用子字符串将Pandas Dataframe 列分割为多个列

cxfofazt  于 2022-11-27  发布在  其他
关注(0)|答案(3)|浏览(223)

Dataframe "df"具有以下数据-
| A列|B栏|
| - -| - -|
| 项目标识1|信息-ID为1的项目的信息\n价格-$7.99\n地点-纽约州奥尔巴尼|
| 项目标识2|信息-ID为2的项目信息\n价格-$5.99\n地点-安大略省渥太华|
如何使用"信息"、"价格"和"地点"将B列中的值分隔到不同的列中,如-
| A列|信息|标价|地点|
| - -| - -| - -| - -|
| 项目标识1| ID为1项目信息|七块九毛九|纽约州奥尔巴尼|
| 项目标识2| ID为2项目信息|五块九毛九|安大略省渥太华|
我尝试根据字符串值(如"Information-"、"Price-"、"Place-")拆分列B,但这变得越来越复杂,而且第一个切片中包含不需要的Price和Place信息。

yqlxgs2m

yqlxgs2m1#

您可以使用pandas.Series.split来解决这个问题:

df[["Information", "Price", "Place"]]= df.pop("Column B").str.split(r"\\n", expand=True)

df= df.astype(str).apply(lambda x: x.replace(x.name, "", regex=True).str.strip(" - "))
#输出:
print(df.to_string())

   Column A                            Information  Price       Place
0  Item_ID1  information for item that has ID as 1  $7.99  Albany, NY
1  Item_ID2        item's information with ID as 2  $5.99  Ottawa, ON
bvn4nwqk

bvn4nwqk2#

对于不需要事先知道未来列的泛型方法,可以使用str.extractallpivot

out = df.drop(columns='Column B').join(
 df['Column B']
 .str.extractall(r'([^-]+) - ([^\n]+)\n?')
 .droplevel('match')
 .pivot(columns=0, values=1)
)
  • 注意:我假设您有真实的的换行符,如果您有两个字符\n,您可以转换为df['Column B'] = df['Column B'].str.replace(r'\\n', '\n')*

输出量:

Column A                            Information       Place  Price
0  Item_ID1  information for item that has ID as 1  Albany, NY  $7.99
1  Item_ID2        item's information with ID as 2  Ottawa, ON  $5.99
zz2j4svz

zz2j4svz3#

另一种可能的解决方案基于以下想法:
1.使用pandas.Series.str.splitColumn B除以\s-\s|\\n
1.使用numpy.reshape改变结果的形状。
1.套用pandas.pivot_table

(pd.concat([df['Column A'], pd.DataFrame(
    df['Column B'].str.split(r'\s-\s|\\n', expand=True, regex=True).values
    .reshape((-1,2)))
 .pivot_table(columns=0, values=1, aggfunc=list)
 .pipe(lambda d: d.explode(d.columns.tolist(), ignore_index=True))], axis=1))

输出量:

Column A                            Information       Place  Price
0  Item_ID1  information for item that has ID as 1  Albany, NY  $7.99
1  Item_ID2        item's information with ID as 2  Ottawa, ON  $5.99

相关问题