Умножить фрейм данных, указав значение c в другом фрейме данных? - PullRequest
0 голосов
/ 12 марта 2020

У меня есть два фрейма данных с подобной формой:

df1 = pd.DataFrame([[3.2,5.8,46],[3.5,4.4,50],[5.4,6.7,40]], index = ['sample1','sample2','sample3'], columns = ['L1','L2','L3'])


L1  L2  L3
sample1 3.2 5.8 46
sample2 3.5 4.4 50
sample3 5.4 6.7 40


df2 = pd.DataFrame([[0.02,0.03,0.04,0.05,0.06],[0.2, 0.3, 0.4, 0.5, 0.7],[2, 3, 4, 5, 7]])


0   1   2   3   4
0   0.02    0.03    0.04    0.05    0.06
1   0.20    0.30    0.40    0.50    0.70
2   2.00    3.00    4.00    5.00    7.00


Я хотел бы умножить первую строку в df2 на значение L1 для образца 1 (3.2) в df1, а затем умножить второй введите в df2 значение L2 для выборки 1 (5.8) в df1, а затем умножьте третью строку в df2 на значение L3 для выборки 1 (46) в df1. Затем мне нужно будет повторить это для образца 2 (например, строка 1 по значению L1 для sample2, строка 2 по значению L2 для sample2 и строка 3 по значению L3 для sample2.) И так далее для каждого образца (с моим фактический набор данных у меня есть сотни образцов). С созданием нового кадра данных либо для каждого сэмпла, либо для всех сэмплов в качестве выходных данных. Я не уверен, как установить соответствующий код?

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Пожалуйста, проверьте следующий код

column_list = df1.columns
sample_list = df1.index

# Loop over samples and columns 
new_df = pd.DataFrame()
for sample in sample_list:
    for ind, column in enumerate(column_list):
        multiply_by_sample = df2.iloc[ind] * df1.loc[sample][column]
        new_df = new_df.append(multiply_by_sample, ignore_index=True)

0 голосов
/ 12 марта 2020

Примерно так:

sample_lists = {}
for df1_index, df1_row in df1.iterrows():
    sample = df1_index
    print(f'\nPROCESSING SAMPLE {sample}')
    df1_row = df1_row.tolist()
    sample_list = []
    for value in df1_row:
        index_number = df1_row.index(value)
        df2_row = df2.iloc[index_number, :].tolist()
        print(f'Mulitplying {df2_row} with {value}')
        int_list = [v*value for v in df2_row]
        sample_list.append(int_list)
    sample_lists[sample] = sample_list
print(f'\nFINAL OUTPUT: {sample_lists}')

Не стесняйтесь удалять операторы print. Затем вы можете использовать эту dict для создания dataframe.

Объяснение:

  • Старт l oop
  • Взять первую строку в df1 и преобразовать его в list
  • Для каждого value в этом списке получить индекс value. Это сделано для того, чтобы вы могли получить строку, соответствующую индексу в df2, что будет нашим следующим шагом.
  • Получить строку, которая соответствует индексу в df2
  • Умножить строка со значением и добавьте его в список
  • Создайте dict с индексом каждой строки в df1 (sample1, sample2, et c.)

Pretty Вы можете использовать lambda и apply для упрощения кода выше.

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