我的数据帧为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循环将其“复制并粘贴”。
非常感谢任何提供帮助的人。
答案 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])