Pandas: подсчет соответствующих значений в каждой строке гигантского информационного кадра на основе информации из меньшего информационного кадра - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть один большой df, отформатированный так:

df1 = 
ID    char
r1    foo
r2    foo
r5    bar
r9    bar
...   ...

И еще один, еще больший, отформатированный так:

df2 = 
ID    a12   b23    c81   ...
r1    foo   baz    bar   ...
r2    foo   foo    bar   ...
r3    bar   bar    baz   ...
r4    bar   baz    bar   ...
...   ...   ...    ...

Глядя на строку идентификатора в обоих df, я хочу собрать количество совпадений остальных столбцов. Поэтому для идентификатора r1 я смотрю на эту строку в df2 и вижу только совпадения a12. Я хочу следить за каждым матчем, поэтому для первого ряда у меня будет

a12    1
b23    0
c81    0

Некоторые строки в df2 не имеют строки в df1 (в df2 есть строка r4, а в df1 нет). Итого для этого примера будет:

a12    2
b23    1
c81    0

df1 - это CSV-файл, который можно загрузить в память, но df2 настолько велик, что я загружаю его порциями. Чтобы сравнить их, я бы загрузил их оба, а затем начал бы что-то вроде:

df1 = pd.read_csv("C:\\Users\\me\\df1.csv")
df2 = pd.read_table("C:\\Users\\me\\df2.vcf.gz", header = None, names = header_line, engine = 'c',
                       compression = 'gzip', chunksize = 40000, low_memory=False)

for chunk in df2:

1 Ответ

0 голосов
/ 17 сентября 2018

Объедините DataFrames вместе, а затем используйте .eq, чтобы увидеть, какие столбцы равны столбцу 'char'.

s = pd.Series()
for chunk in df2:
    merged = df1.merge(chunk, on='ID')
    s = s.add(merged[[col for col in chunk.columns if col != 'ID']].eq(merged.char, axis=0).sum(), 
              fill_value=0)

Выход: s

a12    2.0
b23    1.0
c81    0.0
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...