如何将多维数据框压缩成单列?
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
None
到 NaN
然后删除 NaN
通过 stack
,最后 groupby
和 apply
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
以上是关于如何将多维数据框压缩成单列?的主要内容,如果未能解决你的问题,请参考以下文章
将不同长度的逗号分隔数据行折叠成单列的首选 Pandas 解决方案 [重复]