Добавить список словарей в dataframe в виде заголовков столбцов и значений - PullRequest
0 голосов
/ 05 апреля 2020

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

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

Pandas Структура данных bitly_links:

index | link        | long_url            | created_at          | link_clicks |
------|-------------|---------------------|---------------------|-------------|
0     | bit.ly/aaaa | https://example.com | 2020-04-01 10:54:33 | 150         |
1     | bit.ly/bbbb | https://example.com | 2020-04-01 10:54:33 | 20          |
2     | bit.ly/cccc | https://example.com | 2020-04-01 10:54:33 | 15          |
3     | bit.ly/dddd | https://example.com | 2020-04-01 10:54:33 | 13          |

Python список стран для одного конкретного c bitly (например, bit.ly / aaaa) ссылка:

countries_data = [
                   {'country': 'US', 'clicks': 150}, {'country': 'UK', 'clicks': 20}, 
                   {'country': 'AU', 'clicks': 45}, {'country': 'ZS', 'clicks': 31}
                 ]

index | country | clicks |
------|---------|--------|
0     | US      | 150    |
1     | UK      | 20     |
2     | AU      | 45     |
3     | ZS      | 31     |

Новый фрейм данных, который я хочу сделать:

index | link        | long_url            | created_at          | link_clicks | US | UK | AU | ZS |
------|-------------|---------------------|---------------------|-------------|----|----|----|----|
0     | bit.ly/aaaa | https://example.com | 2020-04-01 10:54:33 | 110         | 20 | 30 | 10 | 50 |
1     | bit.ly/bbbb | https://example.com | 2020-04-01 10:54:33 | 89          | 25 | 41 | 11 | 12 |
2     | bit.ly/cccc | https://example.com | 2020-04-01 10:54:33 | 81          | 10 | 27 | 31 | 14 |
3     | bit.ly/dddd | https://example.com | 2020-04-01 10:54:33 | 126         | 11 | 74 | 31 | 10 |

1 Ответ

1 голос
/ 05 апреля 2020

Я думаю, что вам нужно привести в порядок данные о стране для каждого клика:

# I take the example with two lists for link-level data related to countries, but
#  it extends to more :
import pandas as pd
countries_data1 = [
                   {'country': 'US', 'clicks': 150}, {'country': 'UK', 'clicks': 20},
                   {'country': 'AU', 'clicks': 45}, {'country': 'ZS', 'clicks': 31}
                 ]
countries_data2 = [
                   {'country': 'US', 'clicks': 150}, {'country': 'UK', 'clicks': 20},
                   {'country': 'AU', 'clicks': 45}, {'country': 'ZS', 'clicks': 31}
                 ]
# transform to dataframe, add variable link, and concat
countries_data1 = pd.DataFrame(countries_data1).assign(link="bit.ly/aaaa")
countries_data2 = pd.DataFrame(countries_data2).assign(link="bit.ly/bbbb")
df = pd.concat([countries_data1, countries_data2]) # you will concat the list of all 
# your dataframes with link information regarding countries, here I only have 2 in
#  this example

# then go in wide format with pivot_table
df = df.pivot_table(index="link", values="clicks", columns="country")

Вы получаете эту таблицу:

country      AU  UK   US  ZS
link                        
bit.ly/aaaa  45  20  150  31
bit.ly/bbbb  45  20  150  31

# assume your first table (simplified) is : 
table = pd.DataFrame({"link": ["bit.ly/aaaa", "bit.ly/bbbb"],
                      "link_clicks": [150,20]})
# set the index for link
table = table.set_index("link")

# then do an outer join on link 
merge_df = pd.concat([table, df], join="outer", axis=1)
merge_df.head()

Вы получаете результат:

             link_clicks  AU  UK   US  ZS
link                                     
bit.ly/aaaa          150  45  20  150  31
bit.ly/bbbb           20  45  20  150  31
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...