У меня есть два CSV, которые при чтении в виде кадров данных выглядят примерно так:
df:
TargetIndex Current1 Current2 Current3
0 0 'D' 'D' 'G'
1 2 0 'E' 'F'
2 0 'A' 'E' 'F'
3 1 0 0 0
4 0 'A' 0 'A'
5 3 'G' 0 0
6 2 'F' 'E' 0
7 4 0 0 0
df2:
TargetIndex Target1 Target2 Target3
0 1 'A' 'A' 'A'
1 2 'B' 'B' 'B'
2 3 'C' 'C' 'C'
3 4 'A' 'B' 'C'
Я пытаюсь заменить только значения 0
в столбцах Current
назначения в столбцах Target
.Тем не менее, только для строк, в которых значение TargetIndex
не равно 0
.
По общему признанию, я не очень разбираюсь в Python и обычно я использую комбинацию дополнительных столбцов и функцию LOOKUP в Excelза это, поэтому я немного борюсь.
То, что я до сих пор делал, это прочитал несколько потоков здесь и попробовал различные варианты использования .loc
, .isin
, .replace
,и .map
между прочим, но мне было очень трудно применять условия TargetIndex != 0
и CurrentX == 0
.
Еще одна вещь, которую я нахожу трудной, это использование второго кадра данных в первую очередьЯ пытался превратить его в .dict
с таким ограниченным успехом, что я действительно знаю, как это работает, я не могу его применить.
Мне удалось преобразовать желаемый результат вследующий код спагетти:
df['Target1'] = df['TargetIndex'].map(df2.set_index('TargetIndex')['Target1'])
df['Target2'] = df['TargetIndex'].map(df2.set_index('TargetIndex')['Target2'])
df['Target3'] = df['TargetIndex'].map(df2.set_index('TargetIndex')['Target3'])
S1 = df.Current1 == 0
S2 = df.Current2 == 0
S3 = df.Current3 == 0
df.loc[S1, 'Current1'] = df['TargetIndex']
df.loc[S2, 'Current2'] = df['TargetIndex']
df.loc[S3, 'Current3'] = df['TargetIndex']
df.replace({'Current1': { 1 : 'A', 2 : 'B', 3 : 'C', 4 : 'A'}}, inplace=True)
df.replace({'Current2': { 1 : 'A', 2 : 'B', 3 : 'C', 4 : 'B'}}, inplace=True)
df.replace({'Current3': { 1 : 'A', 2 : 'B', 3 : 'C', 4 : 'C'}}, inplace=True)
df.drop(df.columns[[4, 5, 6]], axis=1, inplace=True)
Который действительно дает желаемый результат:
df:
TargetIndex Current1 Current2 Current3
0 0 'D' 'D' 'G'
1 2 'B' 'E' 'F'
2 0 'A' 'E' 'F'
3 1 'A' 'A' 'A'
4 0 'A' 0 'A'
5 3 'G' 'C' 'C'
6 2 'F' 'E' 'B'
7 4 'A' 'B' 'C'
Однако требуется вручную ввести, что заменить чем, что не совсем эффективно или жизнеспособнокогда df2 csvсодержит более 5000 строкДолжен быть намного лучший способ сделать это, которого я просто не вижу или не понимаю должным образом, поэтому я решил, что с таким же успехом могу спросить.