我有两个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'
我要做的只是用Target
列中的值替换0
列中的Current
值。但是,仅在TargetIndex
值不是0
的行上。你知道吗
无可否认,我对Python还没有太多经验,通常我会使用额外的列和excel中的LOOKUP函数来实现这一点,所以我很费劲。你知道吗
到目前为止,我在这里读了一堆线程,并尝试了.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'
然而,它需要手动输入要替换的内容,当df2csv包含5000+行时,这不是很有效或可行。 必须有一个更好的方法来做这件事,我只是没有看到或理解正确,所以我想我可能会问。你知道吗
如果列数相同,则可以使用:
如果顺序很重要,添加
reset_index
进行排序:相关问题 更多 >
编程相关推荐