как перебрать 2 кадра данных для column.length - 1 - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть dataframe_old, который я хочу преобразовать в dataframe_new, чтобы я мог использовать его позже. Dataframe_old. Мне удалось создать структуру dataframe_new, так что мне нужно было только заполнить все ячейки путем поиска dataframe_old для каждой пары строк / столбцов. Столбец 1 имеет ключ для каждого поля id и значения, но я всегда за пределами. Мне нужно сделать что-то вроде «итерации» до столбца 1, но мои попытки не дали хороших результатов.

Это 2 кадра данных, с которыми я работаю

import pandas as pd
import numpy as np

data_old = {'seq': [100,100,100,100,1002,1002,1002,1003],
        'fieldID':['name','income','married','age','name','dollar','date','age'],
        'fieldValue':['George',100,'yes',38,'Martiness','5000','01/01/2000','45']
       }


data_new = {'seq': [100,1002,1003],
         'name': ['','',''],
         'income': ['','',''],
         'married': ['','',''],
         'age': ['','',''],
         'dollar': ['','',''],
         'date': ['','','']            
        }

df_old = pd.DataFrame(data_old)
df_new = pd.DataFrame(data_new, index = data_new['seq'])

Я создал функцию, которая поможет мне найти значения

def find_value(sequence, field_identifier):
    '''
    search for values of fields from the original 
    export by using the sequence number and field id
    ''' 
    try:
        df_func = df_all.loc[(df_all['seq'] == sequence) & (df_all["fieldID"] == field_identifier)]
        field_value = df_func.at[0, "fieldValue"]
    except:
        field_value = ""

    return field_value

Теперь я пытаюсь объединить все но это заканчивается без границ

for row in df_new.iterrows():
    cnt_col = 0
    first = True

    for column in df_new:
        if first:
            first = False
            continue
        else:
                fieldID = df.columns[cnt_col]
                seq = index

                df_new.loc[app, fieldID] = find_value(app, fieldID)

                cnt_col += 1

Это то, что мой ожидаемый результат будет

data_expected = {'seq': [100,1002,1003],
                 'name': ['George','Martiness',''],
                 'income': [100,'5000',''],
                 'married': ['yes','',''],
                 'age': [38,'','45'],
                 'dollar': ['','',''],
                 'date': ['','01/01/2000','']            
        }

df_expected = pd.DataFrame(data_expected)

Я пытался искать в Интернете, но я застрял на этой части и просто не могу заставить его работать.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Если у вас нет нескольких fieldID на seq:

df_old.pivot(index="seq", columns="fieldID", values="fieldValue").reset_index().fillna('')

Выходы:

fieldID   seq age        date  ... income married       name
0         100  38              ...    100     yes     George
1        1002      01/01/2000  ...                 Martiness
2        1003  45              ...                          

Если у вас есть несколько fieldID, и вы sh чтобы сохранить их всех - это объединит их в list:

df_old.pivot_table(index="seq", columns="fieldID", values="fieldValue", aggfunc=list).reset_index()

Выходы:

fieldID   seq   age  ... married         name
0         100  [38]  ...   [yes]     [George]
1        1002   NaN  ...     NaN  [Martiness]
2        1003  [45]  ...     NaN          NaN
0 голосов
/ 28 февраля 2020

Вы можете попробовать это:

d = (df_old.groupby('seq')
       .apply(lambda x: dict(zip(x['fieldID'],x['fieldValue'])))
       .to_dict())
pd.DataFrame.from_dict(d, orient='index')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...