操纵熊猫数据框

时间:2018-11-16 01:34:55

标签: python pandas

我有一个DataFrame A,其中有一列location_ms。我想除以;:以得到DataFrame B

DataFrame A(开始):

Beginning

DataFrame B(最终版):

Final

我的以下代码似乎非常绕行,很想看到针对该问题的更好实现。通过拆分,我创建了一个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

谢谢!

1 个答案:

答案 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])

您可以根据需要将其合并回去。