获取列中的每个元素以使用python计算和创建新列

时间:2018-01-19 14:47:21

标签: python

我有一个如下所示的数据集;

ID val
1  3.1
2  2.7
3  6.3
4  1.3

并且想要计算每行之间的val的相似性以获得如下的矩阵

ID val  c_1  c_2  c_3  c_4
1  3.1  0.0  0.4  -3.2 0.8
2  2.7  -0.4 0.0  -3.6 1.4
3  6.3  3.2  3.6  0.0  5.0
4  1.3  -0.8 -1.4 -5.0 0.0

我有以下代码:

def similarities(data):
    j=0
    k=0
    for i in data:
        data[j,k+2] = data[j+1] - data[j]
        j=j+1
        k=k+1
        return None

目前这显然不起作用,但这是尝试迭代数据集和使用索引的正确方法吗?

2 个答案:

答案 0 :(得分:4)

我认为您需要np.subtract.outer,创建新的Dataframejoin原件:

df1=pd.DataFrame(np.subtract.outer(df['val'], df['val']), columns=df['ID']).add_prefix('c_')
df = df.join(df1)
print (df)
   ID  val  c_1  c_2  c_3  c_4
0   1  3.1  0.0  0.4 -3.2  1.8
1   2  2.7 -0.4  0.0 -3.6  1.4
2   3  6.3  3.2  3.6  0.0  5.0
3   4  1.3 -1.8 -1.4 -5.0  0.0

广播的另一种解决方案:

val = df.val.values
ids = df.ID.values

df1 = pd.DataFrame(val[:, None] - val, columns = ids).add_prefix('c_')
df = df.join(df1)
print (df)
   ID  val  c_1  c_2  c_3  c_4
0   1  3.1  0.0  0.4 -3.2  1.8
1   2  2.7 -0.4  0.0 -3.6  1.4
2   3  6.3  3.2  3.6  0.0  5.0
3   4  1.3 -1.8 -1.4 -5.0  0.0

答案 1 :(得分:0)

你可以试试这个:

s = """
ID val
1  3.1
2  2.7
3  6.3
4  1.3
"""
data = [i.split() for i in filter(None, s.split('\n'))]
rows = map(float, zip(*data[1:])[-1])
final_data = [[i+b]+[round(b-c, 2) for c in rows] for i, b in enumerate(rows, start=1)]
print('ID  val  {}'.format(' '.join('c_{}'.format(i) for i in range(1, len(rows)+1))))
for row in final_data:
   print(' '.join(map(str, row)))

输出:

ID  val c_1 c_2 c_3 c_4
4.1 0.0 0.4 -3.2 1.8
4.7 -0.4 0.0 -3.6 1.4
9.3 3.2 3.6 0.0 5.0
5.3 -1.8 -1.4 -5.0 0.0