Как умножить строку pandas df на число n, оставив разделитель между ними? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть pandas df, как показано ниже:

Type,Col1,Col2,Col3,Col4
Type1,test1,,test1 || test2,test4
Type2,never_mind1,,never_mind1 || never_mind4,
Type4,never_mind3,never_mind1,never_mind1 || never_mind2,
Type3,never_mind3,,,never_mind3

Для строки, где Type - это Type1, оставшаяся часть столбца должна иметь n первоначальных значений в n раз. Значения должны иметь разделитель '|| '. Если ячейка была пустой, то она должна оставаться пустой.

Ниже приведен желаемый результат для n = 3:

Type,Col1,Col2,Col3,Col4
Type1,test1 || test1  || test1 ,,test1 || test2 || test1 || test2 || test1 || test2,test4 || test4 || test4
Type2,never_mind1,,never_mind1 || never_mind4,
Type4,never_mind3,never_mind1,never_mind1 || never_mind2,
Type3,never_mind3,,,never_mind3

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Фильтровать строки по Series.eq и имена столбцов по Index.difference и поэлементно по DataFrame.applymap использовать лямбда-функцию с np.repeat только для не пропущенные значения:

n = 3
m = df["Type"].eq("Type1")
cols = df.columns.difference(['Type'])
repeat = lambda x: ' || '.join(np.repeat(x, n)) if pd.notna(x) else np.nan
df.loc[m, cols] = df.loc[m, cols].applymap(repeat)
print (df)
    Type                     Col1         Col2  \
0  Type1  test1 || test1 || test1          NaN   
1  Type2              never_mind1          NaN   
2  Type4              never_mind3  never_mind1   
3  Type3              never_mind3          NaN   

                                                Col3                     Col4  
0  test1 || test2 || test1 || test2 || test1 || t...  test4 || test4 || test4  
1                         never_mind1 || never_mind4                      NaN  
2                         never_mind1 || never_mind2                      NaN  
3                                                NaN              never_mind3  
0 голосов
/ 06 февраля 2020

Использование str.join с applymap:

n = 3
f = lambda x: " || ".join([x for _ in range(n)]) if pd.notna(x) else x
df.update(df[df["Type"].eq("Type1")].filter(like="Col").applymap(f))

Вывод:

    Type                     Col1         Col2                                               Col3                     Col4
0  Type1  test1 || test1 || test1          NaN  test1 || test2 || test1 || test2 || test1 || t...  test4 || test4 || test4
1  Type2              never_mind1          NaN                         never_mind1 || never_mind4                      NaN
2  Type4              never_mind3  never_mind1                         never_mind1 || never_mind2                      NaN
3  Type3              never_mind3          NaN                                                NaN              never_mind3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...