Как суммировать значения определенного столбца в пандах - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть 12GB CSV-файл и как суммировать конкретные столбцы на основе значений других столбцов

import pandas as pd
df = pd.read_csv("/Users/kiya/sentbytetop.csv", dtype={'ip':str}, names=['url','bytes','ip'])
df1 = df.groupby(['ip', 'url'], as_index=False)['bytes'].sum()
df1['bytes'] /= 10**6
df1= df1.rename(columns={'bytes':'MB'})
print(df1)

мой выход:

url                  bytes      ip
setup.icl.com:443    "600"  "175.11.8.11"         
setup.icl.com:443    "272"  "172.18.8.26"
dap-int.net:443      "243"  "172.16.22.241" 

Как суммировать байты столбца с уникальным IP-адресом и URL, например

url                    bytes       ip
setup.iclo.com:443    "3633.6 "  "175.11.8.11"         
setup.iclo.com:443    "3676.6 "  "172.18.8.26"
dap-int.net:443       "2647.2"  "172.16.22.241"

Ответы [ 2 ]

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

Первый агрегат sum, затем деление на MB и последний столбец переименования:

#convert ip column to strings
df = pd.read_csv("/Users/kiya/sentbytetop.csv", dtype={'ip':str})

df1 = df.groupby(['ip', 'url'], as_index=False)['bytes'].sum()
df1['bytes'] /= 10**6
df1= df1.rename(columns={'bytes':'MB'})
print (df1)
              ip                url        MB
0  172.16.22.241    dap-int.net:443  0.000243
1    172.18.8.26  setup.icl.com:443  0.000272
2    175.11.8.11  setup.icl.com:443  0.000600
0 голосов
/ 05 сентября 2018

Главное, вам нужно преобразовать байты из объекта в int или с плавающей точкой для их суммирования.

df2 = pd.DataFrame([['setup.icl.com:443', "600", "175.11.8.11" ],
                    ['setup.icl.com:443', "272", "172.18.8.26"],
                    ['dap-int.net:443', "243", "172.16.22.241"],
                    ['dap-int.net:443', "243", "172.16.22.241"],
                    ['dap-int.net:441', "243", "172.16.22.241"],
                    ['dap-int.net:441', "243", "172.16.22.241"]],
                   columns=['url', 'bytes', 'ip'])

                  url   bytes        ip
0   setup.icl.com:443   600 175.11.8.11
1   setup.icl.com:443   272 172.18.8.26
2   dap-int.net:443     243 172.16.22.241
3   dap-int.net:443     243 172.16.22.241
4   dap-int.net:441     243 172.16.22.241
5   dap-int.net:441     243 172.16.22.241


df2.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 3 columns):
url      6 non-null object
bytes    6 non-null object
ip       6 non-null object
dtypes: object(3)
memory usage: 224.0+ bytes

df2['bytes'] = df2['bytes'].astype('float64')

df2.groupby(['ip', 'url'])[['bytes']].sum()

                                     bytes
            ip              url 
172.16.22.241   dap-int.net:441     486.0
                dap-int.net:443     486.0
172.18.8.26     setup.icl.com:443   272.0
175.11.8.11     setup.icl.com:443   600.0

включает преобразование из байтов в мегабайты ( за каждый израэль )

df2['Mbytes'] = df2['bytes'].astype('float64')/10**6

                 url     bytes        ip         Mbytes
0   setup.icl.com:443   600 175.11.8.11     0.000600
1   setup.icl.com:443   272 172.18.8.26     0.000272
2   dap-int.net:443     243 172.16.22.241   0.000243
3   dap-int.net:443     243 172.16.22.241   0.000243
4   dap-int.net:441     243 172.16.22.241   0.000243
5   dap-int.net:441     243 172.16.22.241   0.000243

df3 = df2.groupby(['ip', 'url'])[['Mbytes']].sum()


                                      Mbytes
            ip              url 
172.16.22.241   dap-int.net:441     0.000486
                dap-int.net:443     0.000486
172.18.8.26    setup.icl.com:443    0.000272
175.11.8.11    setup.icl.com:443    0.000600

вы можете поэкспериментировать с timeit, чтобы увидеть, какой метод самый быстрый

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...