Выберите строки, в которых значения хотя бы в одном столбце отрицательны - PullRequest
0 голосов
/ 06 декабря 2018

Учитывая DataFrame:

df = pd.DataFrame(
    {'AgeAtMedStart': {1: -46.47, 2: 46.47, 3: 46.8, 4: 51.5, 5: 51.5},
     'AgeAtMedStop': {1: 46.8, 2: 46.8, 3: nan, 4: -51.9, 5: 51.81},
     'MedContinuing': {1: 'No', 2: 'No', 3: 'Yes', 4: 'No', 5: 'No'},
     'Medication': {1: 'Med1', 2: 'Med2', 3: 'Med3', 4: 'Med4', 5: 'Med4'},
     'YearOfMedStart': {1: 2016.0, 2: 2016.0, 3: 2016.0, 4: 2016.0, 5: 2016.0}}
)

df 
   AgeAtMedStart  AgeAtMedStop MedContinuing Medication  YearOfMedStart
1         -46.47         46.80            No       Med1          2016.0
2          46.47         46.80            No       Med2          2016.0
3          46.80           NaN           Yes       Med3          2016.0
4          51.50        -51.90            No       Med4          2016.0
5          51.50         51.81            No       Med4          2016.0

Я хочу отфильтровать, чтобы сохранить строки, где любое из числовых значений в столбцах "AgeAt *" отрицательно.

Мой ожидаемый результат для этоговыходные данные должны иметь строку с индексом 1, поскольку «AgeAtMedStart» имеет значение -46,47, а строка с индексом 4, поскольку «AgeAtMedStop» составляет -51,9, поэтому выходные данные будут

   AgeAtMedStart  AgeAtMedStop MedContinuing Medication  YearOfMedStart
1         -46.47          46.8            No       Med1          2016.0
4          51.50         -51.9            No       Med4          2016.0

EDIT1:

Итак, я пробовал разные ответы, предоставленные до сих пор, но все возвращают пустой фрейм данных.И я считаю, что часть проблемы заключается в том, что у меня есть еще один столбец с именем AgeAtMedStartFlag (и AgeAtMedStopFlag), который содержит строки.Таким образом, для этого примера csv:

RecordKey   Medication  CancerSiteForTreatment  CancerSiteForTreatmentCode  TreatmentLineCodeKey    AgeAtMedStart   AgeAtMedStartFlag   YearOfMedStart  MedContinuing   AgeAtMedStop    AgeAtMedStopFlag    ChangeOfTreatment
1   Drug1   Site1   C1.0    First   -46.47  Year And Month Are Known But Day Is Missing And Coded To 15 2016    No  46.8    Year And Month Are Known But Day Is Missing And Coded To 15 Yes
1   Drug2   Site2   C1.1    First   46.47   Year And Month Are Known But Day Is Missing And Coded To 15 2016    No  46.8    Year And Month Are Known But Day Is Missing And Coded To 15 Yes
1   Drug3   Site3   C1.2    First   46.8    Year And Month Are Known But Day Is Missing And Coded To 15 2016    Yes         Yes
2   Drug4   Site4   C1.3    First   51.5        2016    No  51.9        Yes
2   Drug5   Site5   C1.4    First   51.5        2016    No  -51.81      Yes
3   Drug6   Site6   C1.5    First   73.93       2016    No  74.42       Yes
3   Drug7   Site7   C1.6    First   73.93       2016    No  74.42       Yes
4   Drug8   Site8   C1.7    First   36.66       2015    No  37.24       Yes
4   Drug9   Site9   C1.8    First   36.66       2015    No  37.24       Yes
4   Drug10  Site10  C1.9    First   36.66       2015    No  37.24       Yes
9   Drug11  Site11  C1.10   First   43.55       2016    No  43.68       Yes
9   Drug12  Site12  C1.11   First   43.22       2016    No  43.49       Yes
9   Drug13  Site13  C1.12   First   43.55       2016    No  43.68       Yes
9   Drug14  Site14  C1.13   First   43.22       2016    No  43.49       Yes
10  Drug15  Site15  C1.14   First   74.42       2016    No  74.84       Yes
10  Drug16  Site16  C1.15   First   73.56       2015    No  73.98       Yes
10  Drug17  Site17  C1.16   First   73.56       2015    No  73.98       No
10  Drug18  Site18  C1.17   First   74.42       2016    No  74.84       No
10  Drug19  Site19  C1.18   First   73.56       2015    No  73.98       No
10  Drug20  Site20  C1.19   First   74.42       2016    No  74.84       No
11  Drug21  Site21  C1.20   First   70.72       2013    No  72.76       No
11  Drug22  Site22  C1.21   First   68.76       2011    No  70.62       No
11  Drug23  Site23  C1.22   First   73.43       2016    No  73.96       No
11  Drug24  Site24  C1.23   First   72.76       2015    No  73.43       No

с этим изменением в моем сценарии:

age_df = df.columns[(df.columns.str.startswith('AgeAt')) & (~df.columns.str.endswith('Flag'))]

df[df[age_df] < 0].to_excel('invalid.xlsx', 'Benjamin_Button')

Возвращает:

RecordKey   Medication  CancerSiteForTreatment  CancerSiteForTreatmentCode  TreatmentLineCodeKey    AgeAtMedStart   AgeAtMedStartFlag   YearOfMedStart  MedContinuing   AgeAtMedStop    AgeAtMedStopFlag    ChangeOfTreatment
1                   -46.47                     
1                                          
1                                          
2                                          
2                                   -51.81     
3                                          
3                                          
4                                          
4                                          
4                                          
9                                          
9                                          
9                                          
9                                          
10                                         
10                                         
10                                         
10                                         
10                                         
10                                         
11                                         
11                                         
11                                         
11

Могу ли я изменить эту реализацию тольковернуть строки, где находятся отрицательные значения и, если возможно, остальные значения для этих строк?Или даже лучше, просто отрицательный возраст и RecordKey для этого ряда.

Ответы [ 2 ]

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

Вот простая однострочная для вас.Если вам необходимо логически определить, является ли столбец числовым, обратитесь к ответу coldspeed.Но, если вы в порядке с явными ссылками на столбцы, простой метод, подобный этому, будет работать.

Примечание. Я также заполняю NaN 0;это будет соответствовать вашим требованиям, даже если данные отсутствуют.Нэн можно обрабатывать другими способами, но этого здесь будет достаточно.Если у вас есть пропущенные значения в других столбцах, которые вы хотите сохранить, это также можно сделать (я не включил это здесь для простоты).

myData = df.fillna(0).query('AgeAtMedStart < 0 or AgeAtMedStop < 0')

Возвращает:

   AgeAtMedStart  AgeAtMedStop MedContinuing Medication  YearOfMedStart
1         -46.47          46.8            No       Med1          2016.0
4          51.50         -51.9            No       Med4          2016.0

Собственный метод запросов Pandas очень удобен для простых выражений фильтров.

Для получения дополнительной информации обратитесь к документации: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.query.html

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

Сначала получите интересующие столбцы:

cols = [col for col in df if col.lower().startswith('AgeAt')]

Затем получите DF с этими столбцами:

df_wanted = df[cols]

Затем получите строки:

x = df_wanted[df_wanted < 0]

Конечно, если вы смотрите на несколько столбцов, некоторые ячейки будут содержать nan.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...