【问题标题】:Change tuple values into dataframe将元组值更改为数据框
【发布时间】:2021-04-26 06:27:35
【问题描述】:

我有一个看起来像这样的数据框(用于说明的虚构数据):

我想将这些元组配对(?)值转换为以下数据框:

Date       Age      Sex       Height(cm)  ...
20150210   23       Female    209         ...
20150421   31       Male      301         ...

在不手动输入每个列名的情况下,将其转换为我想要的数据框的最简单方法是什么?

谢谢。

【问题讨论】:

  • 你如何创建这个数据框?
  • @Ynjxsjmh 首先我必须执行正则表达式来提取这些值,然后我使用 dataframe.from_records 创建了上述数据框,如果我正确理解了您的问题

标签: dataframe tuples


【解决方案1】:

假设您的原始数据是列表元组的列表。您可以将元组的内部列表转换为字典,然后将其传递给pd.DataFrame() 以创建数据帧。

data= [[('Date', '2015 02 10 '), ('Age', '  23'), ('Sex',   'Female'), ('Height(cm)', '209'), ('Weight(kg)',  '42.0')],
       [('Date', '2015 04 21 '), ('Age', '  31'), ('Sex',   'Male'  ), ('Height(cm)', '301'), ('Weight(kg)',  '69.0')],
       [('Date', '2015 04 21 '), ('Age', '  11'), ('Sex',   'Male'  ), ('Height(cm)', '150'), ('Weight(kg)',  '69.0')]]

df = pd.DataFrame(map(dict, data))
print(df)

         Date Age     Sex  Height(cm)  Weight(kg)
0  2015 02 10  23  Female         209        42.0
1  2015 04 21  31    Male         301        69.0
2  2015 04 21  11    Male         150        69.0

您的数据中似乎有多余的空格,您可以使用删除它们

df.columns = df.columns.str.strip()
df = df.applymap(lambda x: x.strip())

你也可以strip创建中的多余空格

df = pd.DataFrame([{k.strip(): v.strip() for k, v in d.items()} for d in map(dict, data)])

如果您的Date 键是可能的重复键,您可以将重复键的值组合到一个列表中。然后在该列上展开以将列表变为多行。

import collections

data= [[('Date', '2015 02 10 '), ('Date', '2015 02 10 '), ('Age', '  23'), ('Sex',  'Female'), ('Height(cm)', '209'), ('Weight(kg)',  '42.0')],
       [('Date', '2015 04 21 '), ('Age', '  31'), ('Sex',   'Male'  ), ('Height(cm)', '301'), ('Weight(kg)',  '69.0')],
       [('Date', '2015 04 21 '), ('Age', '  11'), ('Sex',   'Male'  ), ('Height(cm)', '150'), ('Weight(kg)',  '69.0')]]

data_ = []
for list_of_tuple in data:
    c = collections.defaultdict(list)

    for a, b in list_of_tuple:
        c[a].append(b)

    data_.append(c.items())

df = pd.DataFrame(map(dict, data_))
df = df.apply(pd.Series.explode)
print(df)

          Date   Age     Sex Height(cm) Weight(kg)
0  2015 02 10     23  Female        209       42.0
0  2015 02 10     23  Female        209       42.0
1  2015 04 21     31    Male        301       69.0
2  2015 04 21     11    Male        150       69.0

【讨论】:

  • @WonChulChung 什么问题?
  • 感谢您的帮助,它非常有效,我确实有一个列表元组的列表。但我面临另一个问题。我没有告诉你完整的故事,但除了上面的元组示例之外,我还有多个具有相同名称(键)的元组,例如 ('Result', '23'), ('Result,' 42') ('Result, ' 43')。您的代码似乎只给了我 ('Result, '43') 作为最终输出。我想让所有三个“结果”元组都出现在数据框中。
  • @WonChulChung 你能发布一个示例数据吗?列表元组的列表包含相同的键?
  • @WonChulChung 你有多少相同的钥匙?只有Result 或更多?
  • 我为迟到的回复道歉,我最终尝试创建一个空列表,然后将单个值附加到数据框。我看到关键解决方案似乎是 map() 函数。感谢您的帮助,它解决了我的问题1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 2022-10-26
  • 2020-10-18
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多