Python Pandas Dataframe Customize Index - PullRequest
       1

Python Pandas Dataframe Customize Index

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

У меня есть простой фрейм данных и 2 строковые переменные, как показано ниже:

index  col1
0         x
1         x
2         x

str1 = 'USD'
str2 = 'pricing'

Я бы хотел переименовать индекс в что-то вроде 'str1-str2 - ###':

index             col1
USD-pricing-001      x
USD-pricing-002      x
USD-pricing-003      x

Любая помощь очень ценится!

Ответы [ 5 ]

3 голосов
/ 20 сентября 2019

Использование: DataFrame.add_prefix , вам также необходимо заранее использовать DataFrame.transpose

, поскольку метод add_prefix действует на столбцы .Также необходимо использовать транспонирование в конце, чтобы вернуть фрейм данных в исходную форму

preffix=str1+'-'+str2+'-00'
df=df.set_index('index').T.add_prefix(preffix).T
print(df)

                col1
index               
USD-pricing-000    x
USD-pricing-001    x
USD-pricing-002    x

Чтобы ответить на комментарий @razdi, к более общему решению, вы должны использовать:

preffix=str1+'-'+str2+'-'
df['index']=[(3-len(key))*'0'+key for key in df['index'].astype(str)]
df=df.set_index('index').T.add_prefix(preffix).T
print(df)

Пример

df=pd.DataFrame()
df['col1']='x x x x x x x x x x x x x x'.split()
df.reset_index(inplace=True)
print(df)

    index col1
0       0    x
1       1    x
2       2    x
3       3    x
4       4    x
5       5    x
6       6    x
7       7    x
8       8    x
9       9    x
10     10    x
11     11    x
12     12    x
13     13    x

с применением показанного кода:

preffix=str1+'-'+str2+'-'
df['index']=[(3-len(key))*'0'+key for key in df['index'].astype(str)]
df=df.set_index('index').T.add_prefix(preffix).T
print(df)

                col1
index               
USD-pricing-000    x
USD-pricing-001    x
USD-pricing-002    x
USD-pricing-003    x
USD-pricing-004    x
USD-pricing-005    x
USD-pricing-006    x
USD-pricing-007    x
USD-pricing-008    x
USD-pricing-009    x
USD-pricing-010    x
USD-pricing-011    x
USD-pricing-012    x
USD-pricing-013    x

Конечно, если ваш фрейм данных содержит менее 1000 строк

2 голосов
/ 20 сентября 2019

Другой более короткий путь здесь

df = df.rename(lambda x: f'{str1}-{str2}-{x:003}')

Out[757]:
                col1
index
USD-pricing-000    x
USD-pricing-001    x
USD-pricing-002    x

Попробуйте использовать listcomp, zip и f-string для создания списка объединенной строки.Наконец, присвойте его df.index

arr = [f'{t[0]}-{t[1]}-{t[2]:03}' for t in 
               zip([str1] * df.index.size, [str2] * df.index.size, df.index)]

In [744]: arr
Out[744]: ['USD-pricing-000', 'USD-pricing-001', 'USD-pricing-002']

df.index = arr

Out[747]:
                col1
USD-pricing-000    x
USD-pricing-001    x
USD-pricing-002    x
1 голос
/ 20 сентября 2019

Вот простое для понимания однострочное решение:

df = pd.DataFrame({'col':['a',0]})

df.index = df.index.to_series().apply(lambda x: str(1) + '-' + str(2) + '-' + str(x).zfill(3))

Вывод:

>>> df
                  col
USD-pricing-000   a
USD-pricing-001   0

Использование zfill устраняет проблему наличия индекса с числамикак 00100.Поскольку вы упомянули формат 'str1-str2-###', я предполагаю, что число должно быть 3 цифры.Используя некоторые из предыдущих форматов, 00 будет фиксированным и приведет к 4-значным числам с большими значениями индекса.

1 голос
/ 20 сентября 2019
df = pd.DataFrame(\
    {'col1': ['x' ,'x' ,'x' ,'x' ,'x'],\
    },)

loops = len(df) + 1 
list_index = []

for x in range(1,loops):
    list_index.append("USD-pricing-00"+str(x))

df.index = list_index
0 голосов
/ 20 сентября 2019

разобрался в пути:

df['temp'] = str1 + '-' str2 + '-' + (df.index + 1).astype('str').str.zfill(3)
df.set_index('temp', inplace = True)

;)

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