Как составить список из диапазона в кадре данных? - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь создать список из кадра данных из диапазона.

Вот мой столбец строк:

df['ID'] =['' ,'2','4', '','8', '','16-18','25', '30-31']
#spaces with no values represent null

Я хотел бы создать вывод, подобный этому:

df['ID'] = [' ', 'ID 2', 'ID 4', 'ID 8',' ', ['ID 16','ID 17', 'ID 18'],
              'ID 25',['ID 30','ID 31']] 

Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Настройка

df = pd.DataFrame()
df['ID'] =[ np.nan, 2,4, np.nan,8, np.nan ,'16-18',25, '30-31']

Затем сначала создайте "ID" для диапазонов

s = df.ID.str.split("-")
s2 = s[s.notna()].apply(lambda x: ("ID "+pd.Series(list(range(int(x[0]), int(x[1])+1))).astype(str)).tolist())

, а затем для обычных случаев (кроме NaN и диапазонов)

non_na = df.ID[df.ID.notna()]
non_na_range = non_na[~non_na.index.isin(s2.index)]
s3 = "ID " + non_na_range.astype(str)

Затем присвойте

df.loc[s2.index, "ID"] = s2
df.loc[s3.index, "ID"] = s3

выход

    ID
0   NaN
1   ID 2
2   ID 4
3   NaN
4   ID 8
5   NaN
6   [ID 16, ID 17, ID 18]
7   ID 25
8   [ID 30, ID 31]
0 голосов
/ 29 июня 2018

IIUC

df.ID.str.split('-').apply(lambda x : x[0] if len(x)<=1 else list(range(int(x[0]),int(x[1])+1)))
Out[182]: 
0                
1               2
2               4
3                
4               8
5                
6    [16, 17, 18]
7              25
8        [30, 31]
Name: ID, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...