如何将多维数据框压缩成单列?

Posted

技术标签:

【中文标题】如何将多维数据框压缩成单列?【英文标题】:How to compress a multi dimentional dataframe into a single column? 【发布时间】:2017-03-25 07:40:18 【问题描述】:

我有以下数据框:

    0   1   2   3   4   5   6   7   8
0   Twitter (True 01/21/2015)   None    None    None    None    None    None    None    None
1   Google, Inc. (True 11/07/2016)  None    None    None    None    None    None    None    None
2   Microsoft, (True 07/01/2016)    Facebook (True 11/01/2016)  None    None    None    None    None    None    None
3   standard & poors, Inc. (True 11/08/2016)    None    None    None    None    None    None    None    None
8   apple (True 11/10/2016)     apple (True 11/01/2016)     None    None    None    None    None    apple (True 11/01/2016)     None

如何将上述数据帧压缩成单个数据帧?:

    0 
0   Twitter (True 01/21/2015)
1   Google, Inc. (True 11/07/2016)
2   Microsoft, (True 07/01/2016) \ Facebook (True 11/01/2016)
3   standard & poors, Inc. (True 11/08/2016) \ 
8   apple (True 11/10/2016) \ apple (True 11/01/2016) \ apple (True 11/01/2016)

我尝试过:

df = df.iloc[:,0].join('\')

但是,我不明白如何添加分隔符。我应该如何使用分隔符压缩数据帧?

【问题讨论】:

【参考方案1】:

我认为你需要 replace NoneNaN 然后删除 NaN 通过 stack,最后 groupbyapply join

df = df.replace(None: np.nan, 'None': np.nan).stack()
df = df.groupby(level=0).apply(' \\ '.join)
print (df)
0                            Twitter (True 01/21/2015)
1                       Google, Inc. (True 11/07/2016)
2    Microsoft, (True 07/01/2016) \ Facebook (True ...
3             standard & poors, Inc. (True 11/08/2016)
8    apple (True 11/10/2016) \ apple (True 11/01/20...
dtype: object

列表理解的另一种解决方案:

df = df.replace(None: np.nan, 'None': np.nan)
#python 3 use str, python 2 basestring
df = df.apply(lambda x : ' \\ '.join([y for y in x if isinstance(y, str)]), axis=1)

print (df)
0                            Twitter (True 01/21/2015)
1                       Google, Inc. (True 11/07/2016)
2    Microsoft, (True 07/01/2016) \ Facebook (True ...
3             standard & poors, Inc. (True 11/08/2016)
8    apple (True 11/10/2016) \ apple (True 11/01/20...
dtype: object

时间安排

#[50000 rows x 9 columns]
df = pd.concat([df]*10000).reset_index(drop=True)

In [43]: %timeit (df.replace(None: np.nan, 'None': np.nan).apply(lambda x : ''.join([y for y in x if isinstance(y, str)]), axis=1))
1 loop, best of 3: 820 ms per loop

In [44]: %timeit (df.replace(None: np.nan, 'None': np.nan).stack().groupby(level=0).apply(' \\ '.join))
1 loop, best of 3: 4.62 s per loop

【讨论】:

谢谢,但是我得到了一个奇怪的格式。每个角色都会倒下。 哪个更快?...我注意到第一个解决方案需要一点时间 是的,列表理解的解决方案更快,因为没有重塑。【参考方案2】:

你可以试试这个(我得到以下输出和一个看起来不错的小数据框):

df = pd.DataFrame('0':['Twitter (True 01/21/2015)', 'Google, Inc. (True 11/07/2016)', ' Microsoft, (True 07/01/2016)'], '1':[None, None, 'Facebook  (True 11/01/2016)'], '2':[None, None, None])
df = df.replace(None: ' ', 'None': ' ')
df.astype(str).apply(lambda x: '\\'.join(x), axis=1)


0                        Twitter (True 01/21/2015)\ \ 
1                   Google, Inc. (True 11/07/2016)\ \ 
2     Microsoft, (True 07/01/2016)\Facebook  (True ...
dtype: object

【讨论】:

谢谢我得到了一个奇怪的格式。所有字符都向下拆分。 你的输出是什么样子的? l i k e t h i s

以上是关于如何将多维数据框压缩成单列?的主要内容,如果未能解决你的问题,请参考以下文章

迅捷在线压缩如何压缩图片文件?压缩成png怎么操作?

如何把一个压缩好的文件,拆分成几个压缩文件?

将不同长度的逗号分隔数据行折叠成单列的首选 Pandas 解决方案 [重复]

怎么把多个文档合并成压缩包

SevenZipSharp - 如何使用 c# 将多个目录压缩成一个文件?

怎么将文件打包成ISO格式的压缩包