鱼C论坛

 找回密码
 立即注册
查看: 89|回复: 11

关于pandas 多文件合并的问题

[复制链接]
发表于 2024-12-30 14:03:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
现在有三个df (分别是从三个文件load下来的)
>>> dfa
   Unnamed: 0  Unnamed: 1 姓名  年龄   身份
0         NaN         NaN  A  10  111
1         NaN         NaN  B  12  222
2         NaN         NaN  C  13  111
3         NaN         NaN  D  15  222
4         NaN         NaN  E  16  111

>>> dfb
   Unnamed: 0  Unnamed: 1  Unnamed: 2  年龄 姓名   身份
0         NaN         NaN         NaN  20  a  111
1         NaN         NaN         NaN  21  b  222
2         NaN         NaN         NaN  22  c  111
3         NaN         NaN         NaN  23  d  222
4         NaN         NaN         NaN  24  e  111
5         NaN         NaN         NaN  25  z  222

>>> dfc
   Unnamed: 0  Unnamed: 1   身份  年龄  姓名
0         NaN         NaN  111  31   f
1         NaN         NaN  222  32   g
2         NaN         NaN  111  33  gh
3         NaN         NaN  222  34   i
4         NaN         NaN  111  35   k
5         NaN         NaN  222  36   q
6         NaN         NaN  222  37   w
7         NaN         NaN  111  38   s
>>>

除了干扰字段外,他们的主字段都是一样的,就是顺序不同 ,  如何合并成一个df  字段按照   身份   年龄   姓名  的顺序  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-12-30 14:09:45 | 显示全部楼层
要将这三个DataFrame合并成一个,并按照字段顺序“身份”、“年龄”、“姓名”排列,可以使用`pandas`库中的`concat`函数。首先,我们需要确保每个DataFrame的列顺序一致,然后再进行合并。以下是实现步骤:

1. 重新排列每个DataFrame的列顺序。
2. 使用`concat`函数合并DataFrame。

以下是具体的代码实现:
import pandas as pd

# 假设dfa, dfb, dfc已经加载

# 重新排列列顺序
dfa = dfa[['身份', '年龄', '姓名']]
dfb = dfb[['身份', '年龄', '姓名']]
dfc = dfc[['身份', '年龄', '姓名']]

# 合并DataFrame
result = pd.concat([dfa, dfb, dfc], ignore_index=True)

print(result)

这样就可以得到一个合并后的DataFrame,字段顺序为“身份”、“年龄”、“姓名”。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-30 14:17:41 | 显示全部楼层
FishC 发表于 2024-12-30 14:09
要将这三个DataFrame合并成一个,并按照字段顺序“身份”、“年龄”、“姓名”排列,可以使用`pandas`库中 ...

合并后的数据,能否增加一列,用以区分哪些数据是dfa的  哪些是dfb的  哪些是dfc的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-30 14:35:20 | 显示全部楼层
wp231957 发表于 2024-12-30 14:17
FishC 发表于 2024-12-30 14:09
要将这三个DataFrame ...


要在合并后的DataFrame中增加一列以区分数据来源,可以在合并之前为每个DataFrame添加一个新的列,标识其来源。然后再进行合并。以下是具体的实现步骤:

1. 为每个DataFrame添加一个新的列,标识数据来源。
2. 使用`concat`函数合并DataFrame。

以下是代码实现:
import pandas as pd

# 假设dfa, dfb, dfc已经加载

# 为每个DataFrame添加来源标识
dfa['来源'] = 'dfa'
dfb['来源'] = 'dfb'
dfc['来源'] = 'dfc'

# 重新排列列顺序
dfa = dfa[['身份', '年龄', '姓名', '来源']]
dfb = dfb[['身份', '年龄', '姓名', '来源']]
dfc = dfc[['身份', '年龄', '姓名', '来源']]

# 合并DataFrame
result = pd.concat([dfa, dfb, dfc], ignore_index=True)

print(result)

这样,合并后的DataFrame中就会有一列“来源”,用以区分数据是来自`dfa`、`dfb`还是`dfc
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
FishC 发表于 2024-12-30 14:35
要在合并后的DataFrame中增加一列以区分数据来源,可以在合并之前为每个DataFrame添加一个新的列,标识 ...

有30个数据
比如:
0.66   0.66    0.71    0.64    0.72     0.6
0.63   0.64    0.66    0.62    0.7       0.7
0.69   0.67    0.67    0.64    0.74     0.74
0.74    0.72   0.62    0.7      0.7      0.68
0.69    0.64   0.66    0.58    0.49     0.85
如何把他们分成5组  每组6个数据,要求这5组数据的和  尽量接近(最小方差)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
wp231957 发表于 2025-01-06 11:14
FishC 发表于 2024-12-30 14:35
要在合并后的DataFra ...


要将这些数据分成5组且每组包含6个数据,并使每组的和尽量接近(即最小化方差),可以使用以下方法。这是一种近似解决方案,因为没有现成的方法能绝对完美地满足所有情况,尤其是当数据组合有限时。

我们可以使用`itertools`库生成可能的分组方式,然后计算每组的和方差,选择方差最小的组合。以下是一个实现步骤的简要代码示例:
import numpy as np
from itertools import permutations

# 输入数据
data = np.array([
    0.66, 0.66, 0.71, 0.64, 0.72, 0.6,
    0.63, 0.64, 0.66, 0.62, 0.7, 0.7,
    0.69, 0.67, 0.67, 0.64, 0.74, 0.74,
    0.74, 0.72, 0.62, 0.7, 0.7, 0.68,
    0.69, 0.64, 0.66, 0.58, 0.49, 0.85
])

# 生成所有可能的分组方式
def generate_groups(data):
    all_perms = permutations(data)
    min_variance = float('inf')
    best_group = None
    
    for perm in all_perms:
        groups = [np.array(perm[i:i+6]) for i in range(0, len(perm), 6)]
        sums = [group.sum() for group in groups]
        variance = np.var(sums)
        
        if variance < min_variance:
            min_variance = variance
            best_group = groups
    
    return best_group

# 找到最佳分组
best_group = generate_groups(data)

# 输出结果
for i, group in enumerate(best_group):
    print(f"Group {i+1}: {group}, Sum: {group.sum()}")

请注意,以上代码的复杂度较高,计算时间可能较长。这是因为`itertools.permutations`在数据量较大时生成的排列组合数量非常可观。对于更大的数据集,可以考虑使用更复杂的优化算法,如模拟退火等。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
FishC 发表于 2025-1-6 11:15
要将这些数据分成5组且每组包含6个数据,并使每组的和尽量接近(即最小化方差),可以使用以下方法。这 ...

原始数据952条   分成17组  每组56个数据   
我的电脑 卡顿了   不知道是没算出来啊   还是死机了
952分17组  有多少种组合啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
wp231957 发表于 2025-01-06 12:08
FishC 发表于 2025-1-6 11:15
要将这些数据分成5组且 ...


将952个数据分成17组,每组56个数据,这个问题实质上是一个组合优化问题,其可能的组合数量非常庞大。具体来说,这涉及到复杂的排列组合计算。

如果按照数学方法尝试计算所有可能的组合及其变体,由于要考虑每个数据的位置,这个组合数非常巨大,无法直接计算。这种超大规模的组合通常不适合用穷举法来解决。

在实际应用中,通常采用启发式算法或优化算法来找到接近最优解的方式,例如模拟退火算法、遗传算法等,以避免穷举所有组合带来的巨大的计算量。因此,对于大规模分组问题,建议尝试优化算法而不是穷举所有组合。

如果您的计算机卡顿,很可能是因为计算复杂度过大,建议采用优化算法来简化计算过程。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 10:59 | 显示全部楼层
FishC 发表于 2025-1-6 12:08
将952个数据分成17组,每组56个数据,这个问题实质上是一个组合优化问题,其可能的组合数量非常庞大。 ...

整合数字序列
3,4,6,9,10,12,15,16,17,18,19,20

要求是  把连续的 放在一起  用连词符 连起来
比如:
3-4,6,9-10,12,15-20
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 10:59 | 显示全部楼层
wp231957 发表于 2025-01-08 10:59
FishC 发表于 2025-1-6 12:08
将952个数据分成17组, ...


要将给定的数字序列整合成连续的范围并用连字符连接,可以编写一个简单的Python函数来实现。以下是一个示例代码:
def consolidate_sequence(numbers):
    if not numbers:
        return ""

    numbers.sort()
    result = []
    start = numbers[0]
    end = numbers[0]

    for num in numbers[1:]:
        if num == end + 1:
            end = num
        else:
            if start == end:
                result.append(f"{start}")
            else:
                result.append(f"{start}-{end}")
            start = end = num

    if start == end:
        result.append(f"{start}")
    else:
        result.append(f"{start}-{end}")

    return ",".join(result)

# 示例使用
numbers = [3, 4, 6, 9, 10, 12, 15, 16, 17, 18, 19, 20]
print(consolidate_sequence(numbers))

这个函数会输出:`3-4,6,9-10,12,15-20

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 11:03 | 显示全部楼层
FishC 发表于 2025-1-8 10:59
要将给定的数字序列整合成连续的范围并用连字符连接,可以编写一个简单的Python函数来实现。以下是一个 ...

如果改用pandas来做  套用现成的函数  是不是有简单的代码呢
整合数字序列
3,4,6,9,10,12,15,16,17,18,19,20

要求是  把连续的 放在一起  用连词符 连起来
比如:
3-4,6,9-10,12,15-20
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 11:03 | 显示全部楼层
wp231957 发表于 2025-01-08 11:03
FishC 发表于 2025-1-8 10:59
要将给定的数字序列整 ...


可以使用`pandas`来处理该问题,通过它的`diff`方法来找出序列中断的地方,然后整合连续的数字。以下是一个简单的方法:
import pandas as pd

# 输入数据
numbers = [3, 4, 6, 9, 10, 12, 15, 16, 17, 18, 19, 20]

# 将数据放入DataFrame
df = pd.DataFrame(numbers, columns=['num'])

# 找出间隔
df['gap'] = df['num'].diff().ne(1).cumsum()

# 整合连续的数字
ranges = df.groupby('gap')['num'].agg(['min', 'max'])
result = ','.join([f"{row['min']}" if row['min'] == row['max'] else f"{row['min']}-{row['max']}" for idx, row in ranges.iterrows()])

print(result)

这个脚本会输出:`3-4,6,9-10,12,15-20`,这就是您想要的格式。利用`pandas`的`groupby`和`agg`功能可以方便地进行这样的操作。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-10 06:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表