как определить значение, измененное в Python, панды в каждом объекте - PullRequest
0 голосов
/ 29 сентября 2019

180762508,1268510763,374723980,293,20180402035748,198,25,1,1 180762508,1268503685,374717256,307,20180402035758,225808,11 180762508,1268492506,37470854035808807222,52,1,1 180762508,1268485868,374697563,248,20180402035818,197,47,1,1 180762508,1268482430,374688520,272,20180402035828,196,31,1,1 180707764,1270608366,374988403394625804020359, 66,37,1,0 180707764,1270620899,374992366,222,20180402035935,68,49,1,0

первый столбец - уникальный идентификатор, а последний столбец - мой интерес. Я хочу знать, какмогу ли я узнать, что последний столбец изменен с 0 на 1? Я создал действительно большой фрейм данных с этим набором данных в пандах

import glob

import pandas as pd

path = r"1\1"

allFiles = glob.glob(path+"\*.DAT")

list=[]

for filename in allFiles:

    df = pd.read_csv(filename, header = None)

    list.append(df)

a = pd.concat(list)

a.head()

это все, что я сделал

У меня нет ошибки, ноЯ хочу знать алгоритм, в котором я могу найти значение последних столбцов, измененное в каждом уникальном идентификаторе. Моя цель состоит в создании фрейма данных, в котором первый столбец является уникальным идентификатором, а второй, третий столбец - широтой, долгота - третьим, вторые столбцы в моемнабор данных и отметка времени, которая находится в 5-ом столбцезначение последнего столбца изменяется с 0 на 1

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

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

В любом случае, вот пример того, что может работать для вас, если вы хотитенайти, когда столбец процентов для идентификатора изменяется с 0 на 1:

import pandas as pd

# Provided data
raw_str = """
180762508,1268510763,374723980,293,20180402035748,198,25,1,1 180762508,1268503685,374717256,307,20180402035758,225,38,1,1 180762508,1268492506,374708540,236,20180402035808,222,52,1,1 180762508,1268485868,374697563,248,20180402035818,197,47,1,1 180762508,1268482430,374688520,272,20180402035828,196,31,1,1 180707764,1270608366,374988433,246,20180402035925,66,37,1,0 180707764,1270620899,374992366,222,20180402035935,68,49,1,0
"""

# Replace newline and split on single whitespace
chunks = raw_str.replace('\n', '').split(' ')

# Create simple dictionary for ID, timestamp, and interest columns
ddict = {}
ddict['id'] = [i.split(',')[0] for i in chunks]
ddict['timestamp'] = [i.split(',')[4] for i in chunks]
ddict['interest'] = [i.split(',')[-1] for i in chunks]

# Convert dictionary to pandas DataFrame
df = pd.DataFrame(ddict)

# Create dictionary for sample data
# This is an existing ID with timestamp in the future and 1 as interest
tdict = {
        'id': '180707764',
        'timestamp': '20180402035945',
        'interest': '1',
        }

Как выглядит df:

          id       timestamp interest
0  180707764  20180402035925        0
1  180707764  20180402035935        0
2  180707764  20180402035945        1
3  180762508  20180402035748        1
4  180762508  20180402035758        1
5  180762508  20180402035808        1
6  180762508  20180402035818        1
7  180762508  20180402035828        1

Продолжение:

# Append that dictionary to your dataframe and sort by id, timestamp
df = df.append(pd.Series(tdict), ignore_index=True).copy(deep=True)
df = df.sort_values(['id', 'timestamp']).reset_index(drop=True)

# Shift dataframe back 1 period by rows
df2 = pd.DataFrame(df.shift(periods=-1, axis=0)

# Merge that dataframe with our original dataframe by index values
# We're dropping an extra id column and renaming our primary id column for aesthetics
df3 = df.merge(df2, left_index=True, right_index=True, suffixes=('_prev', '_curr'))
df3 = df3.drop('id_curr', axis=1).rename(columns={'id_prev': 'id'})

Чтоdf3 выглядит так:

          id  timestamp_prev interest_prev  timestamp_curr interest_curr
0  180707764  20180402035925             0  20180402035935             0
1  180707764  20180402035935             0  20180402035945             1
2  180707764  20180402035945             1  20180402035748             1
3  180762508  20180402035748             1  20180402035758             1
4  180762508  20180402035758             1  20180402035808             1
5  180762508  20180402035808             1  20180402035818             1
6  180762508  20180402035818             1  20180402035828             1
7  180762508  20180402035828             1             NaN           NaN

Теперь мы можем просто создать условное выражение для возврата строки, в которой процент изменился с 0 на 1:

In[0]: df3[(df3['interest_prev'] == '0') & (df3['interest_curr'] == '1')]

, который возвращает:

   timestamp_prev interest_prev    id_curr  timestamp_curr interest_curr
1  20180402035935             0  180707764  20180402035945             1

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

df3[(df3['interest_prev'] == '0') & (df3['interest_curr'] == '1')]['timestamp_y']
df3[(df3['interest_prev'] == '0') & (df3['interest_curr'] == '1')][['id', 'timestamp_y']]

Или используйте исходный кадр данных (df) и .iloc, чтобы получить указанные данные:

df.iloc[df3[(df3['interest_prev'] == '0') & (df3['interest_curr'] == '1')].index, :]

Out:

          id       timestamp interest
1  180707764  20180402035935        0
0 голосов
/ 29 сентября 2019

Если я вас понял, вам нужно получить 5-ю строку, в которой происходит изменение от 0 до 1. В последнем столбце.

Я создал кадр данных с вашим первым и последним столбцом (покстати, вы сказали, что 1-й столбец является своего рода уникальным идентификатором, но я вижу повторяющиеся числа), в любом случае, исходя из ваших примеров данных, одно из возможных решений:

  import pandas as pd

  data = [[180762508,1],[180762508,1],[180762508,1],[180762508,1],[180762508,1],[180707764,0],[180707764,0]]

  df = pd.DataFrame(data,columns=['my_id','interest'])

  #new dataframe to compare the column interest
  df2 = df.loc[df['interest'] != df['interest'].shift(-1)] 
  #output:
  #        my_id  interest
  # 4  180762508         1
  # 6  180707764         0

   imax = df2.index.max() #index after the change
   imin = df2.index.min() #index before the change

   for i in range(imin,imax,1):
               i 

   #the row with the change in the original dataframe
   print(df.loc[i])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...