【问题标题】:outer join of pandas df generated from for loop从 for 循环生成的 pandas df 的外连接
【发布时间】:2021-02-17 17:29:14
【问题描述】:

我有一个 for 循环,它在第一次迭代中生成一个数据框,例如:

pd.DataFrame(columns = ["Al", "Si", "K", "Th"], data = [[1,2,3,4]])

第二次迭代产生的数据帧如下所示:

pd.DataFrame(columns = ["W", "Cu"], data = [[5,6]])

列和数据变量都是在每次迭代中通过循环生成的。 我希望能够在执行每个数据帧的外部连接的循环末尾添加一些内容,以便最终结果是:

pd.DataFrame(columns = ["Al", "Si", "K", "Th", "W", "Cu"], data = [[1,2,3,4, 0,0], [0,0,0,0, 5,6]])

我尝试过追加、连接和外连接,但无法破解,因为我需要在每次迭代时实时更新最终数据帧,并且无法对其进行排序。

另外,值得一提的是,我无法预先定义总量列,计算的元素取决于数据并在循环期间创建。

编辑: 这是循环:

formulas = ("NaAlSiO2", "WCu2")

for form in formulas:

    s = re.findall('([A-Z][a-z]?)([0-9]*)', form)

    perc_weight = []
    atoms = []

    for elem, count in s:

        total_weight = molecular_w_calc(form)
        atoms.append(elem)
        perc_weight.append((Element_mass[elem]*100*int(count)) / total_weight)
        perc_df = pd.DataFrame(columns = np.array(atoms), data = [perc_weight]) 

Element_mass 是一个字典,其中包含每个原子的值。 perc_df 是每次迭代产生的数据帧。 molecular_w_calc 返回单个值。

谢谢!

【问题讨论】:

  • 我不明白您所说的“每次迭代中最终数据帧的实时更新”是什么意思。但我怀疑您并不想每次通过循环都创建一个单独的 DataFrame 对象。无论如何,这将有助于显示您正在使用的实际代码。
  • @KarlKnechtel 我已将循环发布为编辑

标签: python pandas for-loop concatenation


【解决方案1】:

如果你想迭代地扩展框架,那么concat 应该可以工作。这个

df1 = pd.DataFrame(columns = ["Al", "Si", "K", "Th"], data = [[1,2,3,4]])
df2 = pd.DataFrame(columns = ["W", "Cu"], data = [[5,6]])
df = pd.concat([df1, df2], axis='rows')
df.fillna(0, inplace=True)

给你

    Al   Si    K   Th    W   Cu
0  1.0  2.0  3.0  4.0  0.0  0.0
0  0.0  0.0  0.0  0.0  5.0  6.0

只是一个建议:如果你只用基本的 Python 来创建底层数据不是更好吗?

类似

import re
import pandas as pd

re_comps = re.compile(r'([A-Z][a-z]?)([0-9]*)')

formulas = ("NaAlSiO2", "WCu2")
elements = {element for formula in formulas
                    for element, _ in re_comps.findall(formula)}
perc_dict = {key: len(formulas) * [None] for key in elements.union({'Formula'})}
for i, formula in enumerate(formulas):
    perc_dict['Formula'][i] = formula
    total_weight = molecular_w_calc(formula)
    for element, count in re_comps.findall(formula):
        count = 1 if count == '' else int(count)
        perc_dict[element][i] = (Element_mass[element] * 100 * count) / total_weight

只有熊猫

perc_df = pd.DataFrame(perc_dict)
perc_df.set_index('Formula', drop=True, inplace=True)
perc_df.sort_index(axis='columns', inplace=True)

生成的perc_df 的结构看起来像(这些值显然是错误的,因为我没有Element_mass 字典和molecular_w_calc 函数):

           Al   Cu   Na    O   Si    W
Formula                               
NaAlSiO2  1.0  NaN  1.0  2.0  1.0  NaN
WCu2      NaN  2.0  NaN  NaN  NaN  1.0

【讨论】:

  • 我之前确实找到了解决方案,但这也有效!谢谢!
猜你喜欢
  • 2018-07-26
  • 2020-09-10
  • 2021-04-22
  • 2020-08-14
  • 1970-01-01
  • 2019-06-21
  • 2020-01-07
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多