Как объединить другие строки фрейма данных с текущей строкой с помощью Python / Pandas - PullRequest
0 голосов
/ 06 января 2019

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

 A1    A2    A3    A4 
 1001  1002  1003  1004
 5001  5002  5003  5004
 7001  7002  7003  7004

Я хотел бы объединить остальные строки с текущей строкой, чтобы она выглядела следующим образом. Например, для первой строки первые четыре столбца остаются неизменными, но столбцы с B1 по B4 являются копиями 2-й строки от A1 до A4, а с C1 по C2 - копии 3-й строки от A1 до A4. Аналогичное слияние для 2-го и 3-го ряда.

A1    A2    A3    A4     B1     B2    B3    B4     C1    C2    C3    C4
1001  1002  1003  1004   5001   5002  5003  5004   7001  7002  7003  7004
5001  5002  5003  5004   7001   7002  7003  7004   1001  1002  1003  1004
7001  7002  7003  7004   1001   1002  1003  1004   5001  5002  5003  5004

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

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Если вы уже создали два других фрейма данных, вы можете просто следовать коду concat. В противном случае вы можете создавать образцы одного и того же кадра данных на основе np.random.permutation, как показано ниже:

>>df1
    A1      A2      A3      A4
0   1001    1002    1003    1004
1   5001    5002    5003    5004
2   7001    7002    7003    7004

df2 = df1.iloc[np.random.permutation(len(df1))]
df2.columns=['B{}'.format(i) for i in range(1, len(df1.columns) + 1)]
>>df2
    B1      B2      B3      B4
1   5001    5002    5003    5004
0   1001    1002    1003    1004
2   7001    7002    7003    7004

df3 = df2.iloc[np.random.permutation(len(df2))]
df3.columns=['C{}'.format(i) for i in range(1, len(df1.columns) + 1)]
>>df3
    C1      C2      C3      C4
2   7001    7002    7003    7004
0   1001    1002    1003    1004
1   5001    5002    5003    5004

Когда у вас есть готовые кадры данных, вы можете объединить их в axis=1, например:

pd.concat([df1,df2,df3],axis=1)

   A1    A2    A3    A4    B1    B2    B3    B4    C1    C2    C3    C4
0  1001  1002  1003  1004  5001  5002  5003  5004  7001  7002  7003  7004
1  5001  5002  5003  5004  7001  7002  7003  7004  1001  1002  1003  1004
2  7001  7002  7003  7004  1001  1002  1003  1004  5001  5002  5003  5004

Примечание Этот процесс выполняется на перестановках, поэтому вы можете ожидать равное количество комбинаций, которые не будут одинаковыми при каждом запуске кода.

0 голосов
/ 06 января 2019

Это мой подход к общему циклу, который, по крайней мере, создает до 25 разумных дополнительных имен столбцов ...:

n = 2   # number of rolled blocks to be concatenated
df2 = df
for i in range(n):
    df_roll = pd.DataFrame(np.roll(df, -(i+1), 0), columns=df.columns.str.replace('A', chr(66+i)))
    df2 = pd.concat([df2, df_roll], 1)

И еще раз, спасибо @DanielMesejo за подсказку, чтобы понять, что не включено в панд: roll

Результат для n = 2:

     A1    A2    A3    A4    B1    B2    B3    B4    C1    C2    C3    C4                                                   
0  1001  1002  1003  1004  5001  5002  5003  5004  7001  7002  7003  7004                                               
1  5001  5002  5003  5004  7001  7002  7003  7004  1001  1002  1003  1004                                               
2  7001  7002  7003  7004  1001  1002  1003  1004  5001  5002  5003  5004                                   
0 голосов
/ 06 января 2019

Вы можете использовать np.roll , чтобы выполнить циклический сдвиг строк df:

df2 = df.reindex(index=np.roll(df.index, -1)).reset_index(drop=True)
df2.columns = ['B{}'.format(i) for i in range(1, len(df.columns) + 1)]

df3 = df.reindex(index=np.roll(df.index, -2)).reset_index(drop=True)
df3.columns = ['C{}'.format(i) for i in range(1, len(df.columns) + 1)]

result = pd.concat([df, df2, df3], axis=1)

print(result)

выход

     A1    A2    A3    A4    B1    B2    B3    B4    C1    C2    C3    C4
0  1001  1002  1003  1004  5001  5002  5003  5004  7001  7002  7003  7004
1  5001  5002  5003  5004  7001  7002  7003  7004  1001  1002  1003  1004
2  7001  7002  7003  7004  1001  1002  1003  1004  5001  5002  5003  5004
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...