【发布时间】:2016-09-14 03:07:06
【问题描述】:
我有一个由这样的字符串组成的数据框:
ID_0 ID_1
g k
a h
c i
j e
d i
i h
b b
d d
i a
d h
对于每对字符串,我可以计算其中有多少行包含任一字符串,如下所示。
import pandas as pd
import itertools
df = pd.read_csv("test.csv", header=None, prefix="ID_", usecols = [0,1])
alphabet_1 = set(df['ID_0'])
alphabet_2 = set(df['ID_1'])
# This just makes a set of all the strings in the dataframe.
alphabet = alphabet_1 | alphabet_2
#This iterates over all pairs and counts how many rows have either in either column
for (x,y) in itertools.combinations(alphabet, 2):
print x, y, len(df.loc[df['ID_0'].isin([x,y]) | df['ID_1'].isin([x,y])])
这给出了:
a c 3
a b 3
a e 3
a d 5
a g 3
a i 5
a h 4
a k 3
a j 3
c b 2
c e 2
c d 4
[...]
问题是我的数据框非常大,字母大小为 200,此方法对每对字母的整个数据框进行独立遍历。
是否可以通过某种方式对数据帧进行单次传递来获得相同的输出?
时间安排
我创建了一些数据:
import numpy as np
import pandas as pd
from string import ascii_lowercase
n = 10**4
data = np.random.choice(list(ascii_lowercase), size=(n,2))
df = pd.DataFrame(data, columns=['ID_0', 'ID_1'])
#Testing Parfait's answer
def f(row):
ser = len(df[(df['ID_0'] == row['ID_0']) | (df['ID_1'] == row['ID_0'])|
(df['ID_0'] == row['ID_1']) | (df['ID_1'] == row['ID_1'])])
return(ser)
%timeit df.apply(f, axis=1)
1 loops, best of 3: 37.8 s per loop
我希望能够在 n = 10**8 时做到这一点。可以加快速度吗?
【问题讨论】:
-
您能否从您在顶部发布的具体示例中发布所需的结果?我得到了结果,但想检查它们是否与您的一致。您想要的结果无法与输入相媲美。不应该将
i a的行结果为 6,因为i在两个列中出现 4 次,a在两个列中出现 2 次? -
@Parfait 'a i' 给出 5,因为您正在计算的行中同时包含 'a' 和 'i',因此不应重复计算。我相信我在问题中发布的结果是正确的,