условие истинно, если в строках панд найдено более одного и они сброшены последними - PullRequest
0 голосов
/ 04 июня 2019

Я написал фрейм данных pandas, чтобы найти экземпляры, в которых «instanceList» хранит все подробности экземпляра.

instanceList = [
    [
        "web-mgmt",
        "i-0268214908adb3949",
        "running",
        "2019-05-06 13:30:11+00:00"
    ],
    [
        "app-srv-1",
        "i-088d90fe72g67fb4c",
        "running",
        "2019-06-04 03:46:03+00:00"
    ],
    [
        "web-mgmt",
        "i-0cwewrgbr45fc8823",
        "running",
        "2019-05-22 14:45:32+00:00"
    ]
]
df = pd.DataFrame(instanceList, columns=['InstanceName', 'InstanceId', 'InstanceState', 'LaunchTime'])
df['Dates'] = pd.to_datetime(df['LaunchTime']).dt.date
df['Time'] = pd.to_datetime(df['LaunchTime']).dt.time
del df['LaunchTime']

Выходные данные для этого фильтра:

   InstanceName           InstanceId InstanceState       Dates      Time
2      web-mgmt  i-0268214908adb3949       running  2019-04-19  14:25:11
3      app-srv-1 i-088d90fe72g67fb4c       running  2019-06-04  03:46:03
5      web-mgmt  i-0cwewrgbr45fc8823       running  2019-05-06  10:30:10

Теперь я хочу выполнить требование ниже:

a.Найти дубликаты на основе имени тега.Если дубликатов нет, распечатайте сообщение.

b.Если дубликат найден, удалите последний экземпляр, посмотрев на дату, чтобы я мог получить все более старые экземпляры в списке.

Пока что я могу найти дубликаты экземпляров со значением ниже

# Find duplicate instance based on tag name
duplicateRows = df[df.duplicated(['InstanceName'], keep=False)]
print(duplicateRows, sep='\n')

вывод ниже таблицы.

   InstanceName           InstanceId InstanceState       Dates      Time
2      web-mgmt  i-0268214908adb3949       running  2019-04-19  14:25:11
5      web-mgmt  i-0cwewrgbr45fc8823       running  2019-05-06  10:30:10

Есть ли способ поместить оператор с условием, подобным этому?не в состоянии понять, пожалуйста, помогите мне.

if df<SOMETHING> >= 1
  duplicateRows = df[df.duplicated(['InstanceName'], keep=False)]
  latest = duplicateRows.max()
  older = duplicateRows.drop(latest) <<-- error: datetime.time(14, 25, 11)] not found in axis
  print(older)
else:
  print message

1 Ответ

1 голос
/ 04 июня 2019

Затем преобразуйте имя экземпляра в единственный уникальный список:

l = list(set(df['InstanceName'].tolist()))

Используйте список для фильтрации df, сбросьте необходимые:

x = []
for i in l:
    df_i = df.loc[df['InstanceName']==i]
    if len(df_i) > 1:
       df_i.set_index('Dates',drop=True,inplace=True)
       df_i = df_i.tail(len(df_i) - 1)
    df_i.reset_index(inplace=True)
    x.append(df_i)

df_final = pd.concat(x,ignore_index=True)

for i,row in df_final.iterrows():
    print(row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...