【发布时间】:2016-11-14 07:25:06
【问题描述】:
我有一个 NxN 数据框。每行对应于作为其索引给出的某个 url(没有“http://”)。每列也表示带有布尔值的 url,指示此页面(行索引)是否链接到该页面(列名)。 url 在索引和列中是相同的。
In [1]: import pandas as pd
In [2]: from pandas import DataFrame
In [3]: df = DataFrame({'domain1.com/url1':[True,False,False,True,False],'domain2.com/url2':[False,True,False,True,True],'domain1.com/url3':[False,False,False,True,False],'domain3.com/url4':[False,True,False,True,False],'domain2.com/url5':[False,True,False,True,True]}, index=['domain1.com/url1','domain2.com/url2','domain1.com/url3','domain3.com/url4','domain2.com/url5'])
In [4]: df
Out[4]:
domain1.com/url1 domain1.com/url3 domain2.com/url2 \
domain1.com/url1 True False False
domain2.com/url2 False False True
domain1.com/url3 False False False
domain3.com/url4 True True True
domain2.com/url5 False False True
domain2.com/url5 domain3.com/url4
domain1.com/url1 False False
domain2.com/url2 True True
domain1.com/url3 False False
domain3.com/url4 True True
domain2.com/url5 True False
例如,现在我可以计算每个 url 的传入和传出链接:
In [5]: in_links_count = df.sum(axis=0)
In [6]: in_links_count
Out[6]:
domain1.com/url1 2
domain1.com/url3 1
domain2.com/url2 3
domain2.com/url5 3
domain3.com/url4 2
dtype: int64
In [7]: out_links_count = df.sum(axis=1)
In [8]: out_links_count
Out[8]:
domain1.com/url1 1
domain2.com/url2 3
domain1.com/url3 0
domain3.com/url4 5
domain2.com/url5 2
dtype: int64
到目前为止一切顺利。但是,如果我只想计算 other 域的传入和传出链接怎么办?我想我需要以某种方式逐行过滤掉列。我尝试了诸如转置数据框(以排除列)和过滤之类的方法,但失败了:
In [9]: df_t = df.T
In [10]: df_t[ filter(lambda x: x.split('/')[0] != df_t.index.map(lambda x: x.split('/')[0]), list(df_t)) ].sum(axis=0)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-10-279439127551> in <module>()
----> 1 df_t[ filter(lambda x: x.split('/')[0] != df_t.index.map(lambda x: x.split('/')[0]), list(df_t)) ].sum(axis=0)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
有什么想法吗,伙计们?
更新:
@piRSquared 提供了一种解决方案,该解决方案通过分层索引(stack()、index.to_series()、轴之间的差异、缺失数据的“假”值 - 见下文)生成第二个数据帧;这适用于中等大小的数据。但是,对于一个大的 NxN 数据帧(1000x1000),这肯定是矫枉过正。是否有其他方法,也许利用就地过滤/映射?
【问题讨论】:
-
但是如果我只想计算其他域的传入和传出链接怎么办? - 能否介绍一下这一点
-
我的意思是指向与正在考虑的 url 域不同的域的链接