Могу ли я дублировать строку с несколькими разными столбцами? Python

#python #pandas #dataframe

#питон #панды #фрейм данных

Вопрос:

Мне нужна ваша помощь То, что я ищу, — это получить приведенную ниже таблицу, начиная с приведенной выше таблицы. Я пробовал разные вещи, но они не сработали.

 Date   ID     Typol   Facial#1   Facial#2

abril  426     COR      1000        500
 
 Date   ID     Typol   Facial

abril  426     COR      1000  
abril  426     LAR      500  
 

Если Typol является COR, используйте значение Facial #1, чтобы дублировать строку с другим типом столбца (положительное значение) и столбец Facial с #2

Комментарии:

1. Откуда вы взяли значение LAR для второй строки?

2. это наоборот

Ответ №1:

Довольно просто создайте 2 df, каждый с одним лицевым столбцом, а затем объедините.

Код:

 df1 = df[['Date','ID','Typol','Facial#1']]
df1.rename(columns = {"Facial#1": "Facial"}, inplace = True)

df2 = df[['Date','ID','Typol','Facial#2']]
df2.rename(columns = {"Facial#2": "Facial"}, inplace = True)

df_final = pd.concat([df1,df2])
 

Комментарии:

1. Это также работает, если это с условиями? Например, что такое Facial # 2, когда Typol является FRW, в противном случае ставится Facial # 1

2. Это для многих строк исходного фрейма данных. Необходимо следовать тем, которые относятся к той же дате

Ответ №2:

Версия 2:

дублируйте строки, переместите лицевую сторону # 2 на лицевую сторону # 1, также учитывайте значение Typol

 c = ['Date','ID','Typol','Facial#1','Facial#2']
d = [['abril',426,'COR',1000,500],
     ['test1',537,'LAR',1500,750]]
import pandas as pd
df = pd.DataFrame(d,columns=c)

df['Typol_X'] = df['Typol']
df.loc[(df['Typol'] == 'COR'), 'Typol_X'] = 'LAR'
df.loc[(df['Typol'] == 'LAR') amp; (df['Typol_X'] == 'LAR'), 'Typol_X'] = 'COR'

print (df)

df = df.loc[df.index.repeat(2)]
df.iloc[1::2,3] = df.iloc[::2,4]
df.iloc[1::2,2] = df.iloc[::2,5]
df.drop(['Facial#2','Typol_X'], axis=1,inplace=True)
df.reset_index(drop=True, inplace=True)
print (df)
 

Результатом этого будет:

Исходный фрейм данных:

     Date   ID Typol  Facial#1  Facial#2 Typol_X
0  abril  426   COR      1000       500     LAR
1  test1  537   LAR      1500       750     COR
 

Обновленный фрейм данных:

     Date   ID Typol  Facial#1
0  abril  426   COR      1000
1  abril  426   LAR       500
2  test1  537   LAR      1500
3  test1  537   COR       750
 

Версия 1:

дублируйте строки, переместите лицевую часть # 2 на лицевую часть # 1

Альтернативный способ сделать это будет следующим:

 c = ['Date','ID','Typol','Facial#1','Facial#2']
d = [['abril',426,'COR',1000,500],
     ['test1',537,'DPS',1500,750]]
import pandas as pd
df = pd.DataFrame(d,columns=c)

df = df.loc[df.index.repeat(2)]
df.iloc[1::2,3] = df.iloc[::2,4]
df.drop(['Facial#2'], axis=1,inplace=True)
df.reset_index(drop=True, inplace=True)
print (df)
 

Результатом этого будет:

Исходный фрейм данных:

     Date   ID Typol  Facial#1  Facial#2
0  abril  426   COR      1000       500
1  test1  537   DPS      1500       750
 

Обновленный фрейм данных:

     Date   ID Typol  Facial#1
0  abril  426   COR      1000
1  abril  426   COR       500
2  test1  537   DPS      1500
3  test1  537   DPS       750
 

Комментарии:

1. Но в вашем коде повторяющаяся строка имеет то же значение в Typol. Мне нужно, чтобы она имела другое значение, например, противоположное (белое / черное)

2. Посмотрите, отвечает ли обновленный ответ на ваш дополнительный вопрос.