Создайте таблицу от года «Начало» до «Конца»

У меня есть список. В основном связаны с некрологами.

Leonard Wilson 1867 - 1936
Mark Jonson 1892 - 1961
Alex Jean Kinshaw 1951 - 1993
Elizabeth Mae Martin 1934 - 1998

Данные необходимо проанализировать для исследования, и они должны быть организованы в формате «csv» с временной шкалой (разделенной знаком «,» и с использованием «-» для нулевых значений), начиная с 1850 г. до 2015 г.

Leonard Wilson,-,-,-,-,-,-,-,-,-,-,-,-,-,-,1867,1868,1869......1934,1935,1936,-,-,-,-,-,-,-,-,-,-,-,-
Mark Jonson,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,1892,1893,1894,1895,1896,1897......,1958,1959,1960,1961,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-
....


# All years in the middle needs to be populated please

В приведенных выше данных вы можете видеть, что годы до рождения человека отмечены «-», а также годы после смерти (до 2015 г.) тем же. Все промежуточные годы должны быть заселены.

Код python/pandas должен определять год начала и окончания, а также

  1. заполнить предшествующие нулевые значения
  2. в средние годы и
  3. конечные нулевые значения

В любом случае это может быть достигнуто, поскольку у меня есть данные более 30 тыс. строк?

Попробуйте использовать fillna() для заполнения значений NA вашими собственными значениями и apply() для преобразования данных метки времени построчно. Просто хотел узнать, что ваши столбцы соответствуют годам (1850...2015)?

k33da_the_bug 25.12.2020 04:45

спасибо за ответ @k33da_lets_debug, да, пожалуйста... в столбцах указаны годы (1850...2015)..

Lokkii9 25.12.2020 05:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
136
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Да, вы можете сделать это так:

df = pd.read_clipboard(header=None, sep='\s\s+')

df_a = df[0].str.rsplit(n=3, expand=True)

df_a = df_a.set_index(0)

full_range = pd.date_range('12/31/1850', '12/31/2015', freq='AS') 
df_a['range'] = [','.join(pd.date_range(i, j, freq='AS')
                            .to_series()
                            .dt.strftime('%Y')
                            .reindex(full_range, fill_value='-')) for i, j in zip(df_a[1], df_a[3])]

df_a.to_csv('test.csv')

Выход:

30 000 строк могут быть немного дороже для циклов ЦП.

Scott Boston 25.12.2020 04:54

Спасибо за решение, Скотт.. но я получаю эту ошибку... __ C:\Code_Trials\Trials.py:9: ParserWarning: возвращаемся к движку 'python', потому что движок 'c' не поддерживает разделители регулярных выражений ( разделители > 1 символа и отличные от '\s+' интерпретируются как регулярное выражение); вы можете избежать этого предупреждения, указав engine='python'. df = pd.read_csv("names_data.txt", header=None, sep='\s\s+')_________[[также я использую Python 3.7.8, если это поможет]]

Lokkii9 25.12.2020 05:44

О ... вы должны найти способ читать в своем фрейме данных. Я просто использую pd.read_clipboard, потому что мне было легко скопировать ваш текст из вопроса. Эти параметры могут не иметь никакого смысла для ваших данных.

Scott Boston 25.12.2020 05:46

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

Lokkii9 25.12.2020 05:49

Если вы используете свою копию и вставку с текстом в этом вопросе и используете pd.read_clipboard, как я здесь. Вы можете напечатать df, чтобы увидеть формат, который я использую для обработки ваших данных. Взгляд на df_a после линии разделения.

Scott Boston 25.12.2020 05:50

хорошо, конечно, я попробую, но я надеюсь, что это не приведет к сбою при выполнении кода ... как вы упоминали ранее, что это может нагружать машину ...

Lokkii9 25.12.2020 05:52

Спасибо, Скотт, я только что попробовал это на примере данных, и это работает так, как вы показали на скриншоте... однако есть ли способ показать даже последний год, например, если он заканчивается в 1961 году, он должен также покажите 1961 год, а не останавливайтесь на 1960 году, пожалуйста..

Lokkii9 25.12.2020 05:59

о, конечно, так что, пожалуйста, поправьте меня, если я ошибаюсь... Я отредактировал, как показано ниже, где в инструкции for я сделал это j+1 ::: переиндексировать (full_range, fill_value = '-')) для i , j+1 в zip(df_a[1], df_a[3])]

Lokkii9 25.12.2020 06:06

Нет.. давайте сделаем это вместо того, чтобы изменить A на AS. начало года для freq в функции date_range. Это работает лучше? обе частоты изменяются на AS вместо A.

Scott Boston 25.12.2020 06:08

конечно.. Надеюсь, на этот раз я правильно понял... :) :: full_range = pd.date_range('31/12/1850', '31/12/2015', freq='AS')

Lokkii9 25.12.2020 06:10

также вторая частота в понимании списка.

Scott Boston 25.12.2020 06:10

О да, идеально! Это сработало :) ... Большое спасибо за вашу помощь, Скотт... счастливого Рождества вам и семье... Благослови вас Бог :)

Lokkii9 25.12.2020 06:12

@Lokkii9 Счастливого Рождества. Будьте в безопасности и будьте здоровы!

Scott Boston 25.12.2020 06:13

Другой способ, просто обрабатывать строку за строкой:

import pandas as pd
import io

df_str = '''
dataLeonard Wilson 1867 - 1936
Mark Jonson 1892 - 1961
Alex Jean Kinshaw 1951 - 1993
Elizabeth Mae Martin 1934 - 1998
'''
obj = pd.read_csv(io.StringIO(df_str.strip()), 
                 sep='\n', 
                 index_col=False, 
                 header=None)
df = obj[0].str.rsplit(' ', 3, expand=True)
df.columns=['name', 'start_yr', '-', 'end_yr']
print(df)


#                       name start_yr  - end_yr
#     0    dataLeonard Wilson     1867  -   1936
#     1           Mark Jonson     1892  -   1961
#     2     Alex Jean Kinshaw     1951  -   1993
#     3  Elizabeth Mae Martin     1934  -   1998

# conver to int column
df[['start_yr', 'end_yr']] = df[['start_yr', 'end_yr']].astype(int)
# iterrows
# expand the start_year and end_year
dfn_list = list()
for _, row in df.iterrows():
    name = row['name']
    start_yr = row['start_yr']
    end_yr = row['end_yr']  
    dfn = pd.DataFrame(list(range(start_yr, end_yr + 1)), columns=['yr'])
    dfn['name'] = name
    dfn['tag']  = dfn['yr'].astype(str)
    dfn_list.append(dfn)

# merge
dfm = pd.concat(dfn_list)
print(dfm.head())

#         yr                name   tag
#     0  1867  dataLeonard Wilson  1867
#     1  1868  dataLeonard Wilson  1868
#     2  1869  dataLeonard Wilson  1869
#     3  1870  dataLeonard Wilson  1870
#     4  1871  dataLeonard Wilson  1871

# transformat
dfm = dfm.set_index(['name', 'yr'])['tag'].unstack(fill_value='-')
dfm.to_csv('test.csv', header=None)

!cat test.csv

результат:

Alex Jean Kinshaw,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,-,-,-,-,-
Elizabeth Mae Martin,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998
Mark Jonson,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-
dataLeonard Wilson,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-

спасибо за решение, Феррис. Я тоже буду работать с этим :)

Lokkii9 29.12.2020 08:22

Другие вопросы по теме