Панды Python фиксируют существующее значение данных для каждого столбца, объединяют новые значения и гарантируют, что значения уникальны для данных столбца - PullRequest
0 голосов
/ 09 октября 2019

Извинения за длинную тему, но я надеюсь, что уловил намерение этого вопроса

Этот вопрос является продолжением Python-панд, чтобы каждая строка, основанная на значении столбца, имела набор данныхЕсли нет, добавьте строку

У меня есть CSV-файл со следующими значениями:

resource_id,resource_type,tag_key,tag_value
vol-00441b671ca48ba41,volume,Environment,Development
vol-00441b671ca48ba41,volume,Name,Database Files
vol-00441b671ca48ba41,volume,Project,Application Development
vol-00441b671ca48ba41,volume,Purpose,Web Server
vol-00441b671ca48ba41,volume,Management,Internal web team
i-1234567890abcdef0,instance,Environment,Production
i-1234567890abcdef0,instance,Owner,Fast Company
i-1234567890abcdef0,instance,Random,Do not remove

Я хочу добавить дополнительные tag_key значения для каждого resource_id, ониявляются:


taglist = ['Application',
           'Client',
           'Environment',
           'Name',
           'Owner',
           'Project',
           'Purpose']

Я достиг 90% того, что я после, и taglist становится ['Application' 'Client' 'Environment' 'Management' 'Name' 'Owner' 'Project' 'Purpose' 'Random']

Однако, это было применено к каждому resource_id

Некоторые tag_key присутствуют только для некоторых resource_id

import pandas as pd
import numpy as np

file_name = "z.csv"

file_name_output = "x.csv"

column_header = ['resource_id', 'resource_type', 'tag_key', 'tag_value']

df = pd.read_csv(file_name, names=column_header)

taglist = ['Application',
           'Client',
           'Environment',
           'Name',
           'Owner',
           'Project',
           'Purpose']

taglist_present = df['tag_key'].unique()

taglist = np.unique(np.concatenate((taglist,taglist_present),0))

print (taglist)

df_out = df.set_index(['resource_id','tag_key'])\
           .reindex(pd.MultiIndex.from_product([df['resource_id'].unique(), taglist],
                                              names=['resource_id','tag_key']))

df_new = df_out.assign(resource_type = df_out.groupby('resource_id')['resource_type']\
                                              .ffill().bfill()).reset_index()

df_new = df_new.reindex(columns=column_header)

print(df_new)

df_new.to_csv(file_name_output, index=False)

Ожидаемые результаты:

              resource_id resource_type      tag_key                tag_value
0   vol-00441b671ca48ba41        volume  Application                      NaN
1   vol-00441b671ca48ba41        volume       Client                      NaN
2   vol-00441b671ca48ba41        volume  Environment              Development
3   vol-00441b671ca48ba41        volume   Management        Internal web team
4   vol-00441b671ca48ba41        volume         Name           Database Files
5   vol-00441b671ca48ba41        volume        Owner                      NaN
6   vol-00441b671ca48ba41        volume      Project  Application Development
7   vol-00441b671ca48ba41        volume      Purpose               Web Server
9     i-1234567890abcdef0      instance  Application                      NaN
10    i-1234567890abcdef0      instance       Client                      NaN
11    i-1234567890abcdef0      instance  Environment               Production
13    i-1234567890abcdef0      instance         Name                      NaN
14    i-1234567890abcdef0      instance        Owner             Fast Company
15    i-1234567890abcdef0      instance      Project                      NaN
16    i-1234567890abcdef0      instance      Purpose                      NaN
17    i-1234567890abcdef0      instance       Random            Do not remove

Фактические результаты:

              resource_id resource_type      tag_key                tag_value
0   vol-00441b671ca48ba41        volume  Application                      NaN
1   vol-00441b671ca48ba41        volume       Client                      NaN
2   vol-00441b671ca48ba41        volume  Environment              Development
3   vol-00441b671ca48ba41        volume   Management        Internal web team
4   vol-00441b671ca48ba41        volume         Name           Database Files
5   vol-00441b671ca48ba41        volume        Owner                      NaN
6   vol-00441b671ca48ba41        volume      Project  Application Development
7   vol-00441b671ca48ba41        volume      Purpose               Web Server
8   vol-00441b671ca48ba41        volume       Random                      NaN
9     i-1234567890abcdef0      instance  Application                      NaN
10    i-1234567890abcdef0      instance       Client                      NaN
11    i-1234567890abcdef0      instance  Environment               Production
12    i-1234567890abcdef0      instance   Management                      NaN
13    i-1234567890abcdef0      instance         Name                      NaN
14    i-1234567890abcdef0      instance        Owner             Fast Company
15    i-1234567890abcdef0      instance      Project                      NaN
16    i-1234567890abcdef0      instance      Purpose                      NaN
17    i-1234567890abcdef0      instance       Random            Do not remove

1 Ответ

0 голосов
/ 09 октября 2019

Давайте использовать union:

df_i = df.set_index(['resource_id','tag_key'])

indx = df_i.index.union((pd.MultiIndex.from_product([df['resource_id'].unique(), taglist],
                                              names=['resource_id','tag_key'])))

df_i = df_i.reindex(indx)
df_i.assign(resource_type = df_i.groupby('resource_id')['resource_type']\
                                              .ffill().bfill()).reset_index()

Вывод:

              resource_id      tag_key resource_type                tag_value
0     i-1234567890abcdef0  Application      instance                      NaN
1     i-1234567890abcdef0       Client      instance                      NaN
2     i-1234567890abcdef0  Environment      instance               Production
3     i-1234567890abcdef0         Name      instance                      NaN
4     i-1234567890abcdef0        Owner      instance             Fast Company
5     i-1234567890abcdef0      Project      instance                      NaN
6     i-1234567890abcdef0      Purpose      instance                      NaN
7     i-1234567890abcdef0       Random      instance            Do not remove
8   vol-00441b671ca48ba41  Application        volume                      NaN
9   vol-00441b671ca48ba41       Client        volume                      NaN
10  vol-00441b671ca48ba41  Environment        volume              Development
11  vol-00441b671ca48ba41   Management        volume        Internal web team
12  vol-00441b671ca48ba41         Name        volume           Database Files
13  vol-00441b671ca48ba41        Owner        volume                      NaN
14  vol-00441b671ca48ba41      Project        volume  Application Development
15  vol-00441b671ca48ba41      Purpose        volume               Web Server
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...