Запустить функцию, которая требует нескольких аргументов через несколько столбцов - Pandas - PullRequest
0 голосов
/ 03 июля 2018

Привет У меня в настоящее время есть функция, которая может разбивать значения в одной ячейке, которая разделена новой строкой. Однако функция, приведенная ниже, принимает меня только для того, чтобы проходить через один столбец за раз, думал, есть ли другие способы, которыми я могу передать его через несколько столбцов или фактически весь фрейм данных.

Пример будет такой

A         B        C 
1\n2\n3  2\n\5     A

Код ниже

def tidy_split(df, column, sep='|', keep=False):
indexes = list()
new_values = list()
df = df.dropna(subset=[column])
for i, presplit in enumerate(df[column].astype(str)):
    values = presplit.split(sep)
    if keep and len(values) > 1:
        indexes.append(i)
        new_values.append(presplit)
    for value in values:
        indexes.append(i)
        new_values.append(value)
new_df = df.iloc[indexes, :].copy()
new_df[column] = new_values
return new_df

В настоящее время работает, когда я запускаю

df1 = tidy_split(df, 'A', '\n')

После запуска функции выбора только столбца A

A   B     C
1   2\n5  A
2   2\n5  A
3   2\n5  A

Я надеялся, что смогу передать не только принятый аргумент, но и в этом случае разделительный столбец «B». Ранее я пытался передать лямбду или пытался использовать apply, но для этого требовался позиционный аргумент «column». Буду признателен за любую помощь, оказанную! Думал, возможна ли петля

РЕДАКТИРОВАТЬ: Желаемый вывод, так как каждый номер относится к чему-то важному До

   A        B     C    
1\n2\n3    2\n5   A     

После

A   B   C
1   2   A
2   5   A
3  n/a  A

1 Ответ

0 голосов
/ 03 июля 2018

Введите:

   A        B     C
0  1\n2\n3  2\n5  A

Код:

import pandas as pd

cols = df.columns.tolist()

# create list in each cell by detecting '\n'
for col in cols:
    df[col] = df[col].apply(lambda x: str(x).split("\n"))

# empty dataframe to store result
dfs = pd.DataFrame()

# loop over rows to construct small dataframes
# and then accumulate each to the resulting dataframe 
for ind, row in df.iterrows():
    a_vals = row['A']
    b_vals = row['B'] + ["n/a"] * (len(a_vals) - len(row['B']))
    c_vals = row['C'] + [row['C'][0]] * (len(a_vals) - len(row['C']))
    temp = pd.DataFrame({'A': a_vals, 'B': b_vals, 'C': c_vals})
    dfs = pd.concat([dfs, temp], axis=0, ignore_index=True)

Выход:

   A    B  C
0  1    2  A
1  2    5  A
2  3  n/a  A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...