UPDATE2: более общая векторная функция, которая будет работать для нескольких normal
и нескольких столбцов list
def explode(df, lst_cols, fill_value=''):
# make sure `lst_cols` is a list
if lst_cols and not isinstance(lst_cols, list):
lst_cols = [lst_cols]
# all columns except `lst_cols`
idx_cols = df.columns.difference(lst_cols)
# calculate lengths of lists
lens = df[lst_cols[0]].str.len()
if (lens > 0).all():
# ALL lists in cells aren't empty
return pd.DataFrame({
col:np.repeat(df[col].values, lens)
for col in idx_cols
}).assign(**{col:np.concatenate(df[col].values) for col in lst_cols}) \
.loc[:, df.columns]
else:
# at least one list in cells is empty
return pd.DataFrame({
col:np.repeat(df[col].values, lens)
for col in idx_cols
}).assign(**{col:np.concatenate(df[col].values) for col in lst_cols}) \
.append(df.loc[lens==0, idx_cols]).fillna(fill_value) \
.loc[:, df.columns]
Демо:
Несколько list
столбцов - все list
столбцы должны иметь одинаковые элементы из каждой строки:
In [36]: df
Out[36]:
aaa myid num text
0 10 1 [1, 2, 3] [aa, bb, cc]
1 11 2 [1, 2] [cc, dd]
2 12 3 [] []
3 13 4 [] []
In [37]: explode(df, ['num','text'], fill_value='')
Out[37]:
aaa myid num text
0 10 1 1 aa
1 10 1 2 bb
2 10 1 3 cc
3 11 2 1 cc
4 11 2 2 dd
2 12 3
3 13 4
Настройка:
df = pd.DataFrame({
'aaa': {0: 10, 1: 11, 2: 12, 3: 13},
'myid': {0: 1, 1: 2, 2: 3, 3: 4},
'num': {0: [1, 2, 3], 1: [1, 2], 2: [], 3: []},
'text': {0: ['aa', 'bb', 'cc'], 1: ['cc', 'dd'], 2: [], 3: []}
})
Столбец CSV:
In [46]: df
Out[46]:
var1 var2 var3
0 a,b,c 1 XX
1 d,e,f,x,y 2 ZZ
In [47]: explode(df.assign(var1=df.var1.str.split(',')), 'var1')
Out[47]:
var1 var2 var3
0 a 1 XX
1 b 1 XX
2 c 1 XX
3 d 2 ZZ
4 e 2 ZZ
5 f 2 ZZ
6 x 2 ZZ
7 y 2 ZZ
используя этот небольшой трюк, мы можем преобразовать CSV-подобный столбец в столбец list
:
In [48]: df.assign(var1=df.var1.str.split(','))
Out[48]:
var1 var2 var3
0 [a, b, c] 1 XX
1 [d, e, f, x, y] 2 ZZ
UPDATE: общий векторный подход (будет работать и для нескольких столбцов):
Original DF:
In [177]: df
Out[177]:
var1 var2 var3
0 a,b,c 1 XX
1 d,e,f,x,y 2 ZZ
Решение:
сначала давайте преобразуем строки CSV в списки:
In [178]: lst_col = 'var1'
In [179]: x = df.assign(**{lst_col:df[lst_col].str.split(',')})
In [180]: x
Out[180]:
var1 var2 var3
0 [a, b, c] 1 XX
1 [d, e, f, x, y] 2 ZZ
Теперь мы можем это сделать:
In [181]: pd.DataFrame({
...: col:np.repeat(x[col].values, x[lst_col].str.len())
...: for col in x.columns.difference([lst_col])
...: }).assign(**{lst_col:np.concatenate(x[lst_col].values)})[x.columns.tolist()]
...:
Out[181]:
var1 var2 var3
0 a 1 XX
1 b 1 XX
2 c 1 XX
3 d 2 ZZ
4 e 2 ZZ
5 f 2 ZZ
6 x 2 ZZ
7 y 2 ZZ
OLD answer:
Вдохновленный решением @AFinkelstein , я хотел сделать его более обобщенным, что может быть применено к DF с более чем два столбца и так же быстро, но почти так же быстро, как и решение Апинкельштейна):
In [2]: df = pd.DataFrame(
...: [{'var1': 'a,b,c', 'var2': 1, 'var3': 'XX'},
...: {'var1': 'd,e,f,x,y', 'var2': 2, 'var3': 'ZZ'}]
...: )
In [3]: df
Out[3]:
var1 var2 var3
0 a,b,c 1 XX
1 d,e,f,x,y 2 ZZ
In [4]: (df.set_index(df.columns.drop('var1',1).tolist())
...: .var1.str.split(',', expand=True)
...: .stack()
...: .reset_index()
...: .rename(columns={0:'var1'})
...: .loc[:, df.columns]
...: )
Out[4]:
var1 var2 var3
0 a 1 XX
1 b 1 XX
2 c 1 XX
3 d 2 ZZ
4 e 2 ZZ
5 f 2 ZZ
6 x 2 ZZ
7 y 2 ZZ
Следующий код позволяет вам создать файл CSV (с разделителем ';') из удаленного домашнего экземпляра Jenkins. https://github.com/gboissinot/jenkins-csvexporter Он использует пакетную структуру для масштабирования с большим объемом заданий.
Не стесняйтесь планировать эту программу повторно.
Теперь, когда Jenkins интегрирует Groovy для сборки Pipeline или просто простые скрипты Groovy, просто написать код Groovy, который использует библиотеки POI Apache, чтобы создать подлинную электронную таблицу Excel с цветами, шрифтами, бликами или тем, что вам нужно.
Существует очень хороший, многофункциональный плагин, который вы можете найти полезным: Глобальный плагин статистики сборки . У него есть функция Сборка поисковой системы , которая даст всю информацию о сборке в таблице.
Второй вариант заключается в создании сценария и использовании его в качестве шагов построить фазу с опцией Выполнить независимо от результата сборки . Скрипт, который может быть любым, может передавать данные после каждой сборки в CSV-файл, а также если вы используете PowerShell - в файл Excel. Черт, если вы используете SDK Google Docs, вы можете легко добавить данные в электронную таблицу GDoc или сделать что-то еще. Здесь нет ограничений.