Pandas:计算一行与所有其他行之间的差异并使用名称创建列
Pandas: Calculate Difference between a row and all other rows and create column with the name
我们有如下数据
Name value1 Value2 finallist
0 cosmos 10 20 [10,20]
1 network 30 40 [30,40]
2 unab 20 40 [20,40]
有什么方法可以区分所有行
最终输出类似于
Name value1 Value2 finallist cosmos network unab
0 cosmos 10 20 [10,20] 0 40 30
1 network 30 40 [30,40] 40 0 10
2 unab 20 40 [20,40] 30 10 0
数据有不同类型的名称,每个名称应该是一列
您需要每行值之和的成对绝对差。最简单的方法可能是使用底层的 numpy 数组。
“值”列之和的绝对差值
# get sum of values per row and convert to numpy array
a = df['value1'].filter(regex='(?i)value').sum(1).to_numpy()
# compute the pairwise difference, create a DataFrame and join
df2 = df.join(pd.DataFrame(abs(a-a[:,None]), columns=df['Name'], index=df.index))
输出:
Name value1 Value2 finallist cosmos network unab
0 cosmos 10 20 [10, 20] 0 40 30
1 network 30 40 [30, 40] 40 0 10
2 unab 20 40 [20, 40] 30 10 0
我不太确定你希望如何计算列中的值,所以我只取了 value1 的差值,但这与本例中的问题无关。我会按照以下方式进行:
for name in df['name']:
vals = []
for idx, row in df.iterrows():
vals.append(int(df.loc[df['name'] == name].value1) - row.value1)
df[name] = vals
因此,对于要为其创建一列的每个名称,您将仔细检查并计算差异,将其添加到列表中,然后将该列表用作新命名列的列值。
这是一个快速修复,可能还有更好的方法,但我希望这对您有所帮助!
我们有如下数据
Name value1 Value2 finallist
0 cosmos 10 20 [10,20]
1 network 30 40 [30,40]
2 unab 20 40 [20,40]
有什么方法可以区分所有行
最终输出类似于
Name value1 Value2 finallist cosmos network unab
0 cosmos 10 20 [10,20] 0 40 30
1 network 30 40 [30,40] 40 0 10
2 unab 20 40 [20,40] 30 10 0
数据有不同类型的名称,每个名称应该是一列
您需要每行值之和的成对绝对差。最简单的方法可能是使用底层的 numpy 数组。
“值”列之和的绝对差值
# get sum of values per row and convert to numpy array
a = df['value1'].filter(regex='(?i)value').sum(1).to_numpy()
# compute the pairwise difference, create a DataFrame and join
df2 = df.join(pd.DataFrame(abs(a-a[:,None]), columns=df['Name'], index=df.index))
输出:
Name value1 Value2 finallist cosmos network unab
0 cosmos 10 20 [10, 20] 0 40 30
1 network 30 40 [30, 40] 40 0 10
2 unab 20 40 [20, 40] 30 10 0
我不太确定你希望如何计算列中的值,所以我只取了 value1 的差值,但这与本例中的问题无关。我会按照以下方式进行:
for name in df['name']:
vals = []
for idx, row in df.iterrows():
vals.append(int(df.loc[df['name'] == name].value1) - row.value1)
df[name] = vals
因此,对于要为其创建一列的每个名称,您将仔细检查并计算差异,将其添加到列表中,然后将该列表用作新命名列的列值。
这是一个快速修复,可能还有更好的方法,但我希望这对您有所帮助!