gpt4 book ai didi

python - Pandas 使用其他列的值创建新列,根据列值选择

转载 作者:行者123 更新时间:2023-12-04 10:11:34 25 4
gpt4 key购买 nike

我有一个看起来有点像这个例子的数据框。由于某些原因,原始数据具有复制的值(value)。

  Node Node 1 Value Node 2 Value Node 3 Value
0 1 A B C
1 2 A B C
2 3 A B C

我想把它改成这样:
  Node Value
0 1 A
1 2 B
2 3 C

此 iterrows 代码按预期工作,但对于我的数据(具有 ~20,000 个值的 48 个节点)来说非常慢。

我觉得一定有更快的方法,也许是 apply但我想不通。
import pandas as pd

df = pd.DataFrame({"Node": ["1", "2", "3"],
"Node 1 Value": ["A","A","A"],
"Node 2 Value": ["B","B","B"],
"Node 3 Value": ["C","C","C"]})

print(df)

for index, row in df.iterrows():
df.loc[index, 'Value'] = row["Node {} Value".format(row['Node'])]

print(df[['Node','Value']])

最佳答案

使用 DataFrame.lookup 然后 DataFrame.assign :

a = df.lookup(df.index, "Node " + df.Node.astype(str) + " Value")

df = df[['Node']].assign(Value = a)
print (df)
Node Value
0 1 A
1 2 B
2 3 C

编辑:如果缺少某些值,您可以通过 numpy.setdiff1d 提取这些值对于具有默认值的字典,例如 np.nan并在 lookup 之前添加到 DataFrame :
print (df)
Node Node 1 Value Node 2 Value Node 3 Value
0 1 A B C
1 2 A B C
3 5 A B C

s = "Node " + df.Node.astype(str) + " Value"
new = dict.fromkeys(np.setdiff1d(s, df.columns), np.nan)
print (new)
{'Node 5 Value': nan}

print (df.assign(**new))
Node Node 1 Value Node 2 Value Node 3 Value Node 5 Value
0 1 A B C NaN
1 2 A B C NaN
3 5 A B C NaN

a = df.assign(**new).lookup(df.index, s)
print (a)
['A' 'B' nan]

df = df[['Node']].assign(Value = a)
print (df)
Node Value
0 1 A
1 2 B
3 5 NaN

另一个想法 definition of lookup :
def f(row, col):
try:
return df.at[row, col]
except:
return np.nan

s = "Node " + df.Node.astype(str) + " Value"
a = [f(row, col) for row, col in zip(df.index, s)]

df = df[['Node']].assign(Value = a)
print (df)
Node Value
0 1 A
1 2 B
3 5 NaN

和解决方案 DataFrame.melt :
s = "Node " + df.Node.astype(str) + " Value"
b = (df.assign(Node = s)
.reset_index()
.melt(['index','Node'], value_name='Value')
.query('Node == variable').set_index('index')['Value'])


df = df[['Node']].join(b)
print (df)
Node Value
0 1 A
1 2 B
3 5 NaN

关于python - Pandas 使用其他列的值创建新列,根据列值选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61314972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com