【问题标题】:Moving data from a dictionary to a pandas DataFrame将数据从字典移动到 pandas DataFrame
【发布时间】:2022-01-13 18:34:10
【问题描述】:

我有一个字典,其中的键是两部分,一个是索引坐标,另一个是列坐标。我想使用这本字典根据这些坐标填充熊猫数据框。

例如我的字典是这样的:

final = {('BUV395', 'BUV496'): 0, ('BUV395', 'BUV563'): 0, ('BUV395', 'BUV615'): 0, ('BUV395', 'BUV661'): 0, etc...

我的函数的输入是带有原始数据的 pandas DataFrame - 只是为了给下面的代码提供上下文:

def matrix_all_pairs(df):
  dataframe = pd.DataFrame(index=range(0,len(df.index.values)),columns=range(0,len(df.index.values)))
  dataframe.columns = df.index.values
  idx = list(df.index.values)
  list_fluor = list(combinations(df.index.values, 2))
  final = {}
  for fluor in list_fluor:
    if (r2_score(df.xs(fluor[0]), df.xs(fluor[1]))) < 0:
      final[fluor] = 0
    else:
      final[fluor] = (r2_score(df.xs(fluor[0]), df.xs(fluor[1])))
  for fluor, value in list_fluor:
    x = value
    dataframe.loc(idx.index(fluor[0]), fluor[1]) = x
  dataframe.index = df.index.values
  return(dataframe)

当我尝试运行它时,它给了我“语法错误:无法分配给函数调用”的行:

    dataframe.loc(idx.index(fluor[0]), fluor[1]) = x

有没有更好的方法来做到这一点?我看到很多人说使用循环填充空 DataFrame 很麻烦,但我不确定我还能怎么做?

我不知道如何发布我的数据以供人们使用 - 我是这个网站的新手。

【问题讨论】:

  • 目前还不清楚您要做什么。你说你有一个字典,它的键/值对看起来像 (str, str'): int 并且你想使用字典创建一个 df 。然后,您将显示一个函数,该函数具有一个名为 df 的变量,该变量通常用于表示一个数据帧,您似乎可以从中创建另一个数据帧。我迷路了,你能澄清一下吗?
  • “我不确定如何发布我的数据以供人们使用”因为您正在尝试创建一个数据框,只需给出您给出的示例 final = {...} 就可以了。然后,我将添加您希望这个小字典成为数据框时的外观。
  • 你得到 SyntaxError: can't assign to function call 因为 df.loc 应该使用 [] 而不是 ()
  • 对于第一条评论:输入 df 具有原始数据。我正在做成对线性回归,将每一行与其他每一行进行比较,并输出一个字典,其中被比较的对作为键,线性回归的 r^2 作为值。然后,我想将该字典转换为一个新的数据框,其中 r^2 在比较的交点处。这有助于澄清事情吗?
  • 第三条评论:谢谢!那行得通。现在我遇到了能够调用每个字典键的第一和第二部分的麻烦。我有它的方式给了我第一个和第二个字母而不是第一个和第二个单词(我认为字符串是“代码”的表达方式?)你有解决方案吗?

标签: python pandas dataframe dictionary


【解决方案1】:

这是你要问的吗?每个元组中的第一项是“行/索引”值,第二项是“列”标题。本质上,您有一个多索引系列,您希望将其拆分为单个索引数据帧。

df = pd.DataFrame.from_dict(final, orient='index')
df[['index','column']] = df.index.values.tolist()
df = df.set_index(['index','column'])[0].unstack()

您的示例 final 字典在第一个元组元素中只有一个唯一键,因此结果将是:

column  BUV496  BUV563  BUV615  BUV661
index                                 
BUV395       0       0       0       0

另一个示例更清楚地显示二维数据帧。

final = {('BUV395', 'BUV496'): 0, ('BUV395', 'BUV563'): 0, ('BUV496', 'BUV395'): 0, ('BUV496', 'BUV563'): 0, ('BUV563', 'BUV395'): 0, ('BUV563', 'BUV496'): 0}

df = pd.DataFrame.from_dict(final, orient='index')
df[['index','column']] = df.index.values.tolist()
df = df.set_index(['index','column'])[0].unstack().rename_axis(None).rename_axis(None, axis=1)
        BUV395  BUV496  BUV563
BUV395     NaN     0.0     0.0
BUV496     0.0     NaN     0.0
BUV563     0.0     0.0     NaN

【讨论】:

  • 这是否适用于创建具有多个索引的数据框?我的实际数据应该创建一个 78x78(索引、列)的数据框。
  • 是的,当然。该示例仅包含一个索引,因为您的示例 final 字典在 4 个元组键中只有一个唯一的第一个元素。
  • 当我尝试这个时,我得到了一个空数据框(全是 NaN)。它也是 77 行,而不是我预期的 78 行。怎么回事?
  • 如果不了解更多关于您的实际数据,这很难说,但我建议您在每一步之后查看您的数据框,看看您从哪里开始看到 NaN 值出现。从字典构造的初始数据帧是否正确?
  • 另外,也许可以通过像len(set([x[0] for x in final.keys()])) 这样的操作来仔细检查您是否真的期望有 78 行。结果将是字典元组键中唯一第一个元素的实际数量(即最终数据帧中的预期行数)。
猜你喜欢
  • 2018-08-19
  • 1970-01-01
  • 2018-02-14
  • 2022-01-03
  • 2019-02-10
  • 2022-01-01
  • 1970-01-01
  • 2016-09-02
  • 2019-06-27
相关资源
最近更新 更多