Python Pandas Создать несколько фреймов данных, разрезая данные в определенных местах - PullRequest
0 голосов
/ 18 декабря 2018

Я новичок в Python и анализа данных с использованием программирования.У меня есть длинный CSV, и я хотел бы динамически создавать DataFrame и строить их позже.Вот пример DataFrame, похожего на данные, которые существуют в моем CSV-файле

df = pd.DataFrame(
{"a" : [4 ,5, 6, 'a', 1, 2, 'a', 4, 5, 'a'],
"b" : [7, 8, 9, 'b', 0.1, 0.2, 'b', 0.3, 0.4, 'b'],
"c" : [10, 11, 12, 'c', 10, 20, 'c', 30, 40, 'c']})

Как видно, есть элементы, которые повторяются в каждом столбце.Поэтому мне сначала нужно найти индекс повторения и последующее его использование для создания подмножеств.Вот как я это сделал.

find_Repeat = df.groupby(['a'], group_keys=False).apply(lambda df: df if
df.shape[0] > 1 else None)

repeat_idxs = find_Repeat.index[find_Repeat['a'] == 'a'].tolist()

Если я напечатаю repeat_idxs, я получу

[3, 6, 9]

И это пример того, чего я хочу достичь в итоге

dfa_1 = df['a'][Index_Identifier[0], Index_Identifier[1])
dfa_2 = df['a'][Index_Identifier[1], Index_Identifier[2])
dfb_1 = df['b'][Index_Identifier[0], Index_Identifier[1])
dfb_2 = df['b'][Index_Identifier[1], Index_Identifier[2])

Но это неэффективно и удобно, так как мне нужно создать много DataFrame, подобных этим, для последующего построения.Поэтому я попробовал следующий метод

dfNames = ['dfa_' + str(i) for i in range(len(repeat_idxs))] 

dfs = dict()
for i, row in enumerate(repeat_idxs):
    dfName = dfNames[i]
    slices = df['a'].loc[row:row+1]
    dfs[dfName] = slices  

Если я распечатаю dfs, это именно то, что я хочу.

{'df_0': 3    a
4    1
Name: a, dtype: object, 'df_1': 6    a
7    4
Name: a, dtype: object, 'df_2': 9    a
Name: a, dtype: object}

Однако, если я хочу прочитать свой csv и применить вышеизложенное,Я не получаю желаемого.Я могу найти повторяющиеся индексы из CSV-файла, но я не могу правильно нарезать данные.Я предполагаю, что я не читаю CSV-файл правильно.Я приложил файл CSV для дальнейшего уточнения CSV файл

1 Ответ

0 голосов
/ 18 декабря 2018

Два варианта:

Зацикливание и срез

Обнаружение индексов повторяющихся строк, а затем зацикливание для нарезки смежных кусков кадра данных, игнорируя повторяющиеся строки:

# detect rows for which all values are equal to the column names
repeat_idxs = df.index[(df == df.columns.values).all(axis=1)]
slices = []
start = 0
for i in repeat_idxs:
    slices.append(df.loc[start:i - 1])
    start = i + 1

Результатом является список фреймов данных slices, представляющих собой срезы ваших данных по порядку.

Использование pandas groupby

Вы также можете сделать это в одну строку, используя pandas groupbyесли вы предпочитаете:

grouped = df[~(df == df.columns.values).all(axis=1)].groupby((df == df.columns.values).all(axis=1).cumsum())

И теперь вы можете перебирать группы следующим образом:

for i, group_df in grouped:
    # do something with group_df
...