Фильтрация содержимого фрейма данных по вхождению строки - PullRequest
2 голосов
/ 10 июля 2019
I have a dataframe of the following type,
              Input         Output         Output SE
  0           Rat           Cat               Mat
  1           rat           cat               mat
  2           0             4.8               0.255
  3           3             7.2               0.32
  4           Bat           Cat               Sat
  5           bat           cat               sat
  6           0             1.8               0.275
  7           3             1.7               0.745

Эти значения считываются с Excel.

Я хочу разделить это содержимое следующим образом

df1=
0            Rat            Cat               Mat
1            rat            cat               mat
2            0              4.8               0.255
3            3              7.2               0.32


df2=

   0         Bat              Cat               Sat
   1         bat              cat               sat
   2         0                1.8               0.275
   3         3                1.7               0.745

Я сейчас использую iloc:

df1 = df.iloc[0:3]
df2 = df.iloc[4:8]

Есть ли альтернативный способ? У меня действительно большой фрейм данных с тем же шаблоном, и я хочу разделить фреймы данных, когда появляются две строки строк.

РЕДАКТИРОВАТЬ: сброс входного кадра данных

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Попробуйте создать новый ключ по //

s1=df.Input.str.isdigit()

for x , y in df.groupby((~s1&s1.shift().fillna(True)).cumsum()):
    print(x,y)


1   Input Output Output SE
0   Rat    Cat       Mat
1   rat    cat       mat
2     0    4.8     0.255
3     3    7.2      0.32
2   Input Output Output SE
4   Bat    Cat       Sat
5   bat    cat       sat
6     0    1.8     0.275
7     3    1.7     0.745

d={x : y for x , y in df.groupby((~s1&s1.shift().fillna(True)).cumsum())}
0 голосов
/ 10 июля 2019

Если вы хотите разделить, как только 2 строки содержат не числовые значения, вы можете просто проверить это, а затем разделить группы на каждом новом лидере группы :

def isnum(ser):
    try:
        pd.to_numeric(ser)
        return True
    except ValueError:
        return False

num = df.apply(isnum)

# df.grp will be 1 if and only if it is the first of a group of at least 2 lines
#  containing non numeric values
df.loc[~(num|(~num.shift().fillna(True))|num.shift(-1).fillna(True)), 'grp'] = 1

# give a different value for each group:
grp = pd.Series(1, df.loc[~(num|(~num.shift().fillna(True))|num.shift(-1).fillna(True)),
                          'grp'].index)
grp = grp.cumsum().reindex(df.index).ffill()

Теперь вы можете использовать groupby, чтобы получить список подкадров данных:

dfs = dfs = [sub for _, sub in df.groupby(grp)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...