Я начинаю с настройки df:
import pandas
records = [
{
"org": "Orange",
"country_1": "USA",
"country_2": "GBR",
"country_3": "AUS",
"type_1": "OWF",
"type_2": "PMR",
"type_3": "KIQ"
},
{
"org": "Watermelon",
"country_1": "AUS",
"country_2": "RUS",
"country_3": "NZL",
"type_1": "ODG",
"type_2": "MOP",
"type_3": "LOF"
}
]
df = pandas.DataFrame(records)
Прежде всего, вы можете использовать метод .filter
из pandas.DataFrame
, чтобы выбрать столбцы через регулярное выражение (как показано здесь ):
>>> df_countries = df.filter(regex=("country_.*"))
country_1 country_2 country_3
0 USA GBR AUS
1 AUS RUS NZL
>>> df_types = df.filter(regex=("type_.*"))
type_1 type_2 type_3
0 OWF PMR KIQ
1 ODG MOP LOF
Тогда вы можете получить все уникальные страны и типы как таковые:
>>> countries_all = df_countries.values.flatten()
array(['USA', 'GBR', 'AUS', 'AUS', 'RUS', 'NZL'], dtype=object)
>>> types_all = df_types.values.flatten()
array(['OWF', 'PMR', 'KIQ', 'ODG', 'MOP', 'LOF'], dtype=object)
их объединение - это вопрос использования декартового произведения из itertools
:
>>> pandas.DataFrame(list(itertools.product(*[list(countries_all), list(types_all)])))
0 1
0 USA OWF
1 USA PMR
2 USA KIQ
3 USA ODG
4 USA MOP
5 USA LOF
6 GBR OWF
7 GBR PMR
8 GBR KIQ
9 GBR ODG
10 GBR MOP
11 GBR LOF
12 AUS OWF
13 AUS PMR
14 AUS KIQ
15 AUS ODG
16 AUS MOP
17 AUS LOF
18 AUS OWF
19 AUS PMR
20 AUS KIQ
21 AUS ODG
22 AUS MOP
23 AUS LOF
24 RUS OWF
25 RUS PMR
26 RUS KIQ
27 RUS ODG
28 RUS MOP
29 RUS LOF
30 NZL OWF
31 NZL PMR
32 NZL KIQ
33 NZL ODG
34 NZL MOP
35 NZL LOF
Теперь я понимаю, что вы могли бы сделать это за org
, и в этом случае я бы подставил подкадр данных до выполнения фильтра:
orgs = pandas.unique(df["org"])
for org in orgs:
df_org = df[df["org"] == org]
df_countries = df_org.filter(regex=("country_.*"))
df_types = df_org.filter(regex=("type_.*"))
# do rest of the process here and concatenate in the end through `pandas.concat`
Надеюсь, это поможет