Python 3.X Pandas - ValueError: должен передавать DataFrame только с логическими значениями - PullRequest
0 голосов
/ 23 января 2020

У меня есть несколько pandas df, которые я пытаюсь нарезать каждый столбец после определенного столбца (Target Col). Проблема в том, что у Target Col каждый раз, когда я пытаюсь нарезать его, будет другой номер индекса. Pandas dfs будет выглядеть так:

+------------+------+------+
| Target Col | Col2 | Col3 |
+------------+------+------+
| Data       | Data | Data |
+------------+------+------+

+------+------------+------+
| Col1 | Target Col | Col3 |
+------+------------+------+
| Data | Data       | Data |
+------+------------+------+

И что я хочу вытащить, это каждый столбец после целевого столбца на каждом df:

+------------+------+
| Target Col | Col3 |
+------------+------+
| Data       | Data |
+------------+------+
+------------+------+------+
| Target Col | Col2 | Col3 |
+------------+------+------+
| Data       | Data | Data |
+------------+------+------+

Что у меня есть для кода пока (сокращено для ясности):

for files in dir:    
    df = pd.read_excel(files)    
    target_cols = [col for col in df if col.startswith('Target Col')]
    list_data = list(df.columns)
    table_tail = df.iloc[:, list_data.index(target_cols[0]):]

Я получаю ошибку " ValueError: необходимо передать DataFrame только с логическими значениями "

Код написан таким образом (в списках и из списков, немного запутанный) из-за попытки написать код для нарезки нескольких Pandas dfs на основе номера индекса. Если у кого-то есть более короткий и менее замысловатый способ заставить это работать, я рад услышать некоторые варианты.

Ответы [ 2 ]

1 голос
/ 23 января 2020

Вот способ, использующий get_loc метод:

cols_to_select = [x for en, x in enumerate(df.columns) if en >= df.columns.get_loc('Target Col')]

df = df[cols_to_select]
1 голос
/ 23 января 2020

Вы можете использовать маски и np.cumsum

import pandas as pd
import numpy as np

cols1 = ["Target Col", "Col2", "Col3"]
cols2 = ["Col1", "Target Col", "Col3"]
df = pd.DataFrame(np.random.randn(4,3),columns=cols1)

target_cols = [col=='Target Col' for col in df]
target_cols = np.cumsum(target_cols).astype(bool)

df = df[df.columns[target_cols]]
print(df)

   Target Col      Col2      Col3
0   -0.191493  1.382337  1.030406
1   -0.008358  0.262019 -1.744335
2   -0.218022  0.010588  0.373674
3   -0.585362 -0.664626 -1.030293


df = pd.DataFrame(np.random.randn(4,3),columns=cols2)
target_cols = [col=='Target Col' for col in df]
target_cols = np.cumsum(target_cols).astype(bool)

df = df[df.columns[target_cols]]
print(df)

   Target Col      Col3
0   -1.677061  0.123344
1   -0.616199 -0.277216
2   -0.541302 -0.635904
3    0.821543 -0.826233

...