熊猫-每行将行复制为新列

时间:2020-07-21 12:19:55

标签: python pandas

我的数据帧为18207x65。每行对应一个玩家,每列对应一个属性。

╔═════════════╦═══════╦═══════╦═════╦════════╗
║             ║ Attr1 ║ Attr2 ║ ... ║ Attr65 ║
╠═════════════╬═══════╬═══════╬═════╬════════╣
║ Player1     ║       ║       ║     ║        ║
║ Player2     ║       ║       ║     ║        ║
║ .           ║       ║       ║     ║        ║
║ .           ║       ║       ║     ║        ║
║ .           ║       ║       ║     ║        ║
║ Player18207 ║       ║       ║     ║        ║
╚═════════════╩═══════╩═══════╩═════╩════════╝

我希望用户键入一个名称,以便程序将该名称与相应的行进行匹配,然后针对每个属性计算该行与其他行(分别)之间的差异度量。均方差或类似的东西似乎是合理的。

我的直觉是选择所需的行,然后将此1x30项“复制并粘贴”到每一行中,以便有30列新列,每列在18207行中重复相同的数目。

╔════════╦═════╦═════╦══════╦══════╦═════╦══════╦═════════╦═════════╦═════╦═════════╗
║        ║ At1 ║ ... ║ At35 ║ At36 ║ ... ║ At65 ║ CP_At35 ║ CP_At36 ║ ... ║ CP_At65 ║
╠════════╬═════╬═════╬══════╬══════╬═════╬══════╬═════════╬═════════╬═════╬═════════╣
║ P1     ║     ║     ║      ║      ║     ║      ║ a       ║ b       ║     ║ c       ║
║ .      ║     ║     ║      ║      ║     ║      ║ a       ║ b       ║     ║ c       ║
║ .      ║     ║     ║      ║      ║     ║      ║ a       ║ b       ║     ║ c       ║
║ .      ║     ║     ║      ║      ║     ║      ║ a       ║ b       ║     ║ c       ║
║ CP     ║     ║     ║ a    ║ b    ║     ║ c    ║ a       ║ b       ║     ║ c       ║
║ .      ║     ║     ║      ║      ║     ║      ║ a       ║ b       ║     ║ c       ║
║ .      ║     ║     ║      ║      ║     ║      ║ a       ║ b       ║     ║ c       ║
║ .      ║     ║     ║      ║      ║     ║      ║ a       ║ b       ║     ║ c       ║
║ P18207 ║     ║     ║      ║      ║     ║      ║ a       ║ b       ║     ║ c       ║
╚════════╩═════╩═════╩══════╩══════╩═════╩══════╩═════════╩═════════╩═════╩═════════╝

从那里我将再次创建30个新列,并为每个列执行(stat_x-selected_player_stat_x)^ 2。

这似乎是完成整个操作的一种非常笨拙的方法。任何精简的替代方案,我将不胜感激。

假设这是最好的/合理的解决方法,我的具体问题是将“单行”复制并粘贴到每一行。

    chosen_player = input()
    chosen_player_index = df1[df1['Name'] == chosen_player].index[0]
    chosen_player_stats = df1.iloc[chosen_player_index:chosen_player_index+1, 35:]

(我要比较的属性从第35列开始。)

我已经选择了所需的1x30数据块,但不知道是否应该使用join / append / concat / merge和/或for循环将其“复制并粘贴”。

非常感谢任何提供帮助的人。

1 个答案:

答案 0 :(得分:0)

我只选择该行并为输出创建另一个数据框:

import pandas as pd

chosen_player = input()
chosen_player_row = d1.query("Name == @chosen_player").iloc[0] 
# you can also check that you have selected only one row with the filter

def your_diff(x, y):
    return (x-y)**2

result_df = pd.DataFrame({})
# or say result_df = df1.iloc[:, :35].copy() if you want some attributes, 
# and I guess you'd want at least Name

stats = list(df1.columns[35:]) # best would be to already have 
# your list of stats for which you want to make the computation

for stat in stats:
    result_df[stat] = df1[stat].apply(lambda x: your_diff(x, chosen_player_row[stat])