我有一个DataFrame A
,其中有一列location_ms
。我想除以;
和:
以得到DataFrame B
。
DataFrame A(开始):
DataFrame B(最终版):
我的以下代码似乎非常绕行,很想看到针对该问题的更好实现。通过拆分,我创建了一个DataFrame,每个元素都是一个列表列表。然后,我将列表的列表展平以创建最终的DataFrame。
def locpapersrc_table(df):
toflattenrows = df['location_ms'].str.split(';').apply(lambda x:[c.split(':') for c in x]).values.tolist()
singlelistoflist = [item for sublist in toflatten for item in sublist]
tmp = pd.DataFrame(singlelistoflist)
return tmp
这个版本2比第一个版本慢,但这也是另一个绕道的方法。
def version2(df):
xx = df["location_ms"].str.split(';',expand = True).T
tmp = pd.melt(xx).dropna().drop(['variable'],axis=1)['value'].str.split(':',expand=True)
return tmp
谢谢!
答案 0 :(得分:2)
尝试这样的事情。
split_df = df['location_ms'].str.split(pat=";", expand=True)
如果要将其合并回原始数据框中,请输入类似的内容。
df = df.merge(split_df, left_index=True, right_index=True)
df = df.drop('location_ms')
对于您的新问题(用;
和:
进行划分):
split_df = df['location_ms'].str.split(pat=";", expand=True)
subsplit_df = pd.DataFrame(index = split_df.index)
for i in range(split_df.shape[1]):
subsplit_df = subsplit_df.merge(split_df.iloc[:, i].str.split(pat=":", expand=True), left_index=True, right_index=True)
subsplit_df.columns = range(subsplit_df.shape[1])
您可以根据需要将其合并回去。