Как объединить столбцы с Dynami c количество столбцов - PullRequest
0 голосов
/ 04 апреля 2020

Я работаю над проектом ИИ, который включает обработку большого количества фреймов данных в Python. Я пытаюсь добавить значения к df, однако я хочу сделать количество столбцов df dynamici c в зависимости от количества столбцов кадра данных a. rowMerge - это функция, которая принимает две переменные (a и b). a - это фрейм данных, который мы предоставляем, а b - фрейм данных, который, как мы ожидаем, вернет функция. Эта функция позволяет мне объединять строки, когда есть пять столбцов.

def rowMerger(a,b):
try:
    b = pd.DataFrame(data=None, columns =[f'Column{i}' for i in range(0, len(a.columns))])
    rule1 = lambda x: x not in ['']
    u = a.loc[a['Column0'].apply(rule1) & a['Column1'].apply(rule1) & a['Column2'].apply(rule1)].index
    findMergerindexs = list(u)
    findMergerindexs.sort()
    a = pd.DataFrame(a)
    if (len(findMergerindexs) > 0):
       for m in range(len(findMergerindexs)):
           if not (m == (len(findMergerindexs)-1)): 
               startLoop = findMergerindexs[m]
               endLoop = findMergerindexs[m+1]
           else:
               startLoop = findMergerindexs[m]
               endLoop = len(a)
           Column0 = ''
           Column1 = ''
           Column2 = ''
           Column3 = ''
           Column4 = ''
           for n in range(startLoop,endLoop):
               Column0 = Column0 + str(a.iloc[n,0])
               Column1 = Column1 + str(a.iloc[n,1])
               Column2 = Column2 + str(a.iloc[n,2])
               Column3 = Column3 + str(a.iloc[n,3])
               Column4 = Column4 + str(a.iloc[n,4])
           b = b.append({'Column0': Column0.strip(), 'Column1': Column1.strip(), 'Column2': Column2.strip(), 'Column3': Column3.strip(), 'Column4': Column4.strip()}, ignore_index=True)
    else:
        print("File is not having a row for merging instances - Please check the file manually for instance - ")
except: 
    print("Error - While merging the rows")
return b

Функция, указанная выше, - это функция, созданная мной для объединения строк, чтобы я мог избавиться от пространства между строками. Например, у меня есть фрейм данных, как показано ниже.

    df=[['7','4','5','7','8'],["","","",'7','4'],['9','4','7','8','4'],["","","",'7','5'],['4','8','5','4','6']]
df=pd.DataFrame(df)
df.columns=[f'Column{i}' for i in range(0, len(df.columns))]



Column0 Column1 Column2 Column3 Column4
7       4       5       7       8 
                        7       4
9       4       7       8       4
                        7       5
4       8       5       4       6

И функция rowMerger убирает пробел между строками и дает мне фрейм данных, который выглядит как показано ниже.

rowMerger(df,0)
    Column1 Column2 Column3 Column4 Column5
    7       4       5       77       84
    9       4       7       87       45
    4       8       5       4         6

Однако эта функция не является динамической c. То есть количество столбцов переменной b определяется вручную. Вместо этого я хочу сделать число столбцов, сгенерированных внутри функции, динамическим c, основываясь на количестве столбцов переменной a. Например, если число столбцов a равно трем, я хочу создать три столбца (Column0, Column0, Column0) и добавить значения к этим столбцам и вернуть фрейм данных с тремя столбцами.

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

1 Ответ

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

Вот функция, которая может помочь; это работает для примера, который вы предоставили, но вам придется настроить его так, чтобы он соответствовал многим другим сценариям ios: Идея состоит в том, чтобы найти строки с пустыми строками, получить столбцы для этих строк, объединить их и как-то передать их вернуться к исходному фрейму данных. Я помещаю комментарии в коде; надеюсь, они должны хорошо объяснить. Дай мне знать, как это происходит. У кого-то еще мог бы быть лучший, так что просто играйте с ним и c.

 def process_data(df):

    #convert to string
    #easier to merge rows
    df = df.astype(str)

    #find rows where there are empty strings
    empty_rows_index = df.loc[df.eq('').any(axis=1)].index

    #find columns where there are no empty strings
    non_empty_cols = df.loc[:,df.ne('').all()].columns.tolist()

    #this gets us the index above the rows with empty strings
    empty_rows_pair = [[ind-1,ind] for ind in empty_rows_index]

    #pair index with columns
    rows_cols = [[entry,non_empty_cols] for entry in empty_rows_pair]

    #this combines the columns where empty strings are in the next row
    #with the non empty string row in the previous column
    lump = [df.loc[x,y].sum().astype('int') for x,y in rows_cols]

    #combine and flip, so that the column names are the headers
    merger = pd.concat(lump,axis=1).T

    #to ensure complete reintegration back to the dataframe
    #set the merger index to the previous row index
    merger.index = [i for i,j in empty_rows_pair]

    #drop the empty string rows
    df = df.drop(empty_rows_index)

    #set the rows in df to match with
    #the rows and columns in merger
    #and assign merger to that section
    df.loc[merger.index,merger.columns] = merger

    df = df.astype(int).reset_index(drop=True)
    return df

    process_data(df)

    Column0 Column1 Column2 Column3 Column4
0       7      4       5      77     84
1       9      4       7      87     45
2       4      8       5      4      6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...