Двойная петля над пандами df - PullRequest
0 голосов
/ 10 мая 2018

У меня есть фрейм данных, содержащий столбец subreddits и другой столбец, содержащий авторов, которые прокомментировали этот subreddit. Вот снимок:

subreddit                                                         user
0xProject            [7878ayush, Mr_Yukon_C, NomChompsky92, PM_ME_Y...
100sexiest                                                   [T10rock]
100yearsago                                       [PM_ME_MII, Quisnam]
1022                           [MikuWaifuForLaifu, ghrshow, johnnymn1]
1200isjerky                             [Rhiann0n, Throwaway412160987]
1200isplenty         [18hourbruh, Bambi726, Cosmiicao, Gronky_Kongg...
1200isplentyketo                                             [yanqi83]
12ozmouse                                                     [ChBass]
12thMan                                      [8064r7, TxAg09, brb1515]
12winArenaLog                                                  [fnayr]
13ReasonsWhy                                    [SawRub, _mw8, morbs4]
13or30                                          [BOTS_RISE_UP, mmcjjc]
14ers                                                      [BuccoFan8]
1500isplenty                                                  [nnowak]
15SecondStories                               [DANKY-CHAN, NORMIESDIE]
18650masterrace                                               [Airazz]
18_19                [-888-, 3mb3r89, FuriousBiCurious, FusRohDoing...
1911                 [EuphoricaI, Frankshungry, SpicyMagnum23, cnw4...
195                                                 [RobDawg344, ooi_]
19KidsandCounting                  [Kmw134, Lvzv, mpr1011, runjanarun]
1P_LSD               [420jazz, A1M8E7, A_FABULOUS_PLUM, BS_work, EL...
2007oneclan                                                    [J_D_I]
2007scape            [-GrayMan-, -J-a-y-, -Maxy-, 07_Tank, 0ipopo, ...
2010sMusic                                                    [Vranak]
21savage                                                     [Uyghur1]
22lr                                                      [microphohn]
23andme              [Nimushiru, Pinuzzo, Pugmas, Sav1025, TOK715, ...
240sx                [I_am_a_Dan, SmackSmackk, jimmyjimmyjimmy_, pr...
24CarrotCraft                                                [pikaras]
24hoursupport        [GTALionKing, Hashi856, Moroax, SpankN, fuck_u...
                                           ...                        
youtubetv                                [ComLaw, P1_1310, kcamacho11]
yoyhammer             [Emicrania, Jbugman, RoninXiC, Sprionk, jonow83]
ypp                                                           [Loxcam]
ypsi                                                           [FLoaf]
ytp                                                         [Profsano]
yugijerk                                             [4sham, Exos_VII]
yugioh               [1001puppys, 6000j, 8512332158, A_fiSHy_fish, ...
yumenikki                                                      [ripa9]
yuri                 [COMMENTS_ON_NSFW_PIC, MikuxLuka401, Pikushibu...
yuri_jp                                                    [Pikushibu]
yuruyuri                    [ACG_Yuri, KirinoNakano, OSPFv3, SarahLia]
zagreb                                                      [jocus985]
zcoin                                                      [Fugazi007]
zec                  [Corm, GSXP, JASH_DOADELESS_, PSYKO_Inc, infinis]
zedmains             [BTZx2, EggyGG, Ryan_A121, ShacObama, Tryxi, m...
zelda                [01110111011000010111, Aura64, AzaraAybara, BA...
zen                  [ASAMANNAMMEDNIGEL, Cranky_Kong, Dhammakayaram...
zerocarb                            [BigBrain007, Manga-san, vicinius]
zetime                                                        [xrnzrx]
zfs                  [Emachina, bqq100, fryfrog, michio_kakus_hair,...
ziftrCOIN                                                      [GT712]
zoemains             [DrahaKka, OJSaucy, hahAAsuo, nysra, x3noPLEB,...
zombies                                             [carbon107, rjksn]
zomby                                                        [jwccs46]
zootopia             [BCRE8TVE, Bocaj1000, BunnyMakingAMark, Far414...
zumba                                                   [GabyArcoiris]
zyramains                                       [Dragonasaur, Shaiaan]
zyzz                                                            [Xayv]

Я пытаюсь перебрать каждый субредит, а затем перебрать каждый субредит под ним, чтобы найти общие комментаторы. Конечной целью является блок данных, содержащий subreddit 1, subreddit 2 и количество общих комментариев.

Я даже не представляю, как это сделать, используя apply, и не уверен, как сделать двойной цикл for с pandas df's.

Это правильная идея?

for i in df2.index:
  subreddit = df2.get_value(i,'subreddit')
    for i+1 in df2.index:
      ...

Вот пример ввода и предполагаемого вывода:

df = pd.DataFrame({'subreddit': ['sub1', 'sub2', 'sub3', 'sub4'],
                   'user': [['A', 'B', 'C'], ['A', 'F', 'C'], ['F', 'E', 'D'], ['X', 'Y', 'Z']]})

Вывод для первого субредита:

subreddit_1 subreddit_2 shared_users
sub1    sub2    2
sub1    sub3    0
sub1    sub4    0

1 Ответ

0 голосов
/ 10 мая 2018

Я не знаю, можно ли обойти с помощью петель.Это похоже на то, как вы рассчитываете матрицу корреляции, которая использует циклы в документации pandas .По крайней мере, это симметрично, так что вам нужно сравнить только половину из них.

Вместо вычисления корреляции вы хотите найти количество элементов, которые разделяются между двумя списками lst1 и lst2, что составляет len(set(lst1) & set(lst2))

import pandas as pd
import numpy as np
df = pd.DataFrame({'subreddit': ['sub1', 'sub2', 'sub3', 'sub4'],
                   'user': [['A', 'B', 'C'], ['A', 'F', 'C'], ['F', 'E', 'D'], ['X', 'Y', 'Z']]})

mat = df.user
cols = df.subreddit
idx = cols.copy()
K = len(cols)
correl = np.empty((K, K), dtype=int)
for i, ac in enumerate(mat):
    for j, bc in enumerate(mat):
        if i > j:
            continue

        c = len(set(ac) &  set(bc))
        correl[i, j] = c
        correl[j, i] = c

overlap_df = pd.DataFrame(correl, index=idx, columns=cols)

#subreddit  sub1  sub2  sub3  sub4
#subreddit                        
#sub1          3     2     0     0
#sub2          2     3     1     0
#sub3          0     1     3     0
#sub4          0     0     0     3

И если выЕсли вы хотите получить те, которые поменьше DataFrames, вам нужно немного манипулировать.Например:

overlap_df.index.name='subreddit_1'
overlap_df[['sub1']].stack().reset_index().rename(columns={0: 'shared_users'})

  subreddit_1 subreddit  shared_users
0        sub1      sub1             3
1        sub2      sub1             2
2        sub3      sub1             0
3        sub4      sub1             1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...