鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: wp231957

[已解决]pandas 保留数据

[复制链接]
 楼主| 发表于 2024-11-15 14:58:26 | 显示全部楼层
FishC 发表于 2024-11-15 14:51
要对 DataFrame 的列进行升序和降序排序并获取两个新 DataFrame,你可以使用 Pandas 的 `sort_values`  ...

现在的需求修正为

import pandas as pd

df = pd.read_excel('5.xlsx',header=None)
# 对于升序排序
df1 = df.sort_values(by=0, ascending=True).reset_index(drop=True)

# 对于降序排序
df2 = df.sort_values(by=0, ascending=False).reset_index(drop=True)
outls=[]
outls.append(df1的1--3,df2的1--3)
outls.append(df1的4--6,df2的4--6)
outls.append(df1的7--9,df2的7--9)
.......
.......
.......
总共追加42次 结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-15 14:58:38 | 显示全部楼层
wp231957 发表于 2024-11-15 14:58
现在的需求修正为

import pandas as pd

df = p ...


要实现这个功能,你可以创建一个新的列表 `outls`,然后按照需求从两个排序后的 DataFrame 中提取特定的行进行追加。以下是实现代码:
import pandas as pd

# 读取 Excel 文件
df = pd.read_excel('5.xlsx', header=None)

# 升序排序
df1 = df.sort_values(by=0, ascending=True).reset_index(drop=True)

# 降序排序
df2 = df.sort_values(by=0, ascending=False).reset_index(drop=True)

# 初始化一个空列表来存储结果
outls = []

# 按照需求从 df1 和 df2 中提取并组合数据,共 42 次
for i in range(42):
    # 计算每次的起始索引
    start_idx = i * 3
    # 从 df1 和 df2 中提取1-3行、4-6行等
    group = pd.concat([df1.iloc[start_idx:start_idx+3], df2.iloc[start_idx:start_idx+3]])
    # 将结果组合转为列表并加入到 outls
    outls.append(group)

# 输出结果
for idx, group in enumerate(outls, start=1):
    print(f"Group {idx}:\n{group}\n")

说明:
- 使用 `pd.concat` 来合并从 `df1` 和 `df2` 中提取的子 DataFrame。
- `iloc[start_idx:start_idx+3]` 用于子集选取,确保每次提取三行。
- 通过循环进行多次合并,把结果加入 `outls`。

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

使用道具 举报

 楼主| 发表于 2024-11-15 15:05:06 | 显示全部楼层
FishC 发表于 2024-11-15 14:58
要实现这个功能,你可以创建一个新的列表 `outls`,然后按照需求从两个排序后的 DataFrame 中提取特定 ...

如果我只想要数据呢   不想要组(group)  
group = pd.concat([df1.iloc[start_idx:start_idx+3], df2.iloc[start_idx:start_idx+3]])
    # 将结果组合转为列表并加入到 outls
    outls.append(group)
结果中 不想包含index 也不想包含字段名
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-15 15:05:16 | 显示全部楼层
wp231957 发表于 2024-11-15 15:05
如果我只想要数据呢   不想要组(group)  
group = p ...


如果你只想要数据,而不需要索引或字段名,可以在将数据添加到 `outls` 前,将其转换为 NumPy 数组或直接提取值。这样会去掉 DataFrame 的索引和列名。下面是如何实现的:
import pandas as pd

# 读取 Excel 文件
df = pd.read_excel('5.xlsx', header=None)

# 升序排序
df1 = df.sort_values(by=0, ascending=True).reset_index(drop=True)

# 降序排序
df2 = df.sort_values(by=0, ascending=False).reset_index(drop=True)

# 初始化一个空列表来存储结果
outls = []

# 按照需求从 df1 和 df2 中提取并组合数据,共 42 次
for i in range(42):
    # 计算每次的起始索引
    start_idx = i * 3
    # 从 df1 和 df2 中提取1-3行、4-6行等,并获取纯数据
    group_data = pd.concat([df1.iloc[start_idx:start_idx + 3], df2.iloc[start_idx:start_idx + 3]]).values
    # 直接将 NumPy 数组添加到列表中
    outls.append(group_data)

# 输出结果
for idx, group_data in enumerate(outls, start=1):
    print(f"Data {idx}:\n{group_data}\n")

说明:
- `.iloc[start_idx:start_idx + 3]` 提取特定的行。
- `.values` 将 DataFrame 转换为 NumPy 数组,去除数据的索引和列名。
- 结果中的每个 `group_data` 是一个二维的 NumPy 数组,仅包含数据本身。

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

使用道具 举报

 楼主| 发表于 2024-11-15 15:10:36 | 显示全部楼层
FishC 发表于 2024-11-15 15:05
如果你只想要数据,而不需要索引或字段名,可以在将数据添加到 `outls` 前,将其转换为 NumPy 数组或直 ...

dtype=object), array    这些东西 也不想要呢
只是单纯的数据   每6个数据构成一个元组   42个元组 构成一个列表  即最终结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-15 15:10:45 | 显示全部楼层
wp231957 发表于 2024-11-15 15:10
dtype=object), array    这些东西 也不想要呢
只是 ...


好的,你希望每6个数据构成一个元组,然后这些元组构成一个列表。这样处理时,可以使用 `.tolist()` 方法将每个 NumPy 数组转换成纯 Python 数据。以下是实现代码:
import pandas as pd

# 读取 Excel 文件
df = pd.read_excel('5.xlsx', header=None)

# 升序排序
df1 = df.sort_values(by=0, ascending=True).reset_index(drop=True)

# 降序排序
df2 = df.sort_values(by=0, ascending=False).reset_index(drop=True)

# 初始化一个空列表来存储结果
outls = []

# 按照需求从 df1 和 df2 中提取并组合数据,共 42 次
for i in range(42):
    # 计算每次的起始索引
    start_idx = i * 3
    # 从 df1 和 df2 中提取1-3行、4-6行等,并生成元组
    group_tuple = tuple(df1.iloc[start_idx:start_idx+3][0].tolist() + df2.iloc[start_idx:start_idx+3][0].tolist())
    # 添加元组到列表
    outls.append(group_tuple)

# 输出结果
print(outls)

说明:
- `df1.iloc[start_idx:start_idx+3][0].tolist()` 提取 DataFrame 列中的前3行并将其转为列表。
- `+` 运算符用于合并两个列表。
- `tuple()` 将合并后的列表转换为元组。
- `outls` 是一个包含42个元组的列表,每个元组由6个数据组成。

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

使用道具 举报

 楼主| 发表于 2024-11-18 12:48:30 | 显示全部楼层
FishC 发表于 2024-11-15 15:10
好的,你希望每6个数据构成一个元组,然后这些元组构成一个列表。这样处理时,可以使用 `.tolist()` 方 ...

>>> df
          客户单号      客户发货时间                                   收货地址    总件数   重量(T)     体积
0   8003723699  2024-09-22                    广东省佛山市高明区更合镇合塘路184号   80.0   2.000   4.00
1   8003723705  2024-09-23                              朱村大道中491号   80.0   2.000   4.00
2   8003723710  2024-09-23                     广东省惠州市博罗县麻陂镇大马路80号   80.0   0.100   4.00
3   8003723710  2024-09-23                     广东省惠州市博罗县麻陂镇大马路80号   80.0   0.100   4.00
4   8003726275  2024-09-22                    广东省广州市南沙区榄核镇大坳村工业B区  200.0   5.000  10.00
5   8003726279  2024-09-22                      广东省佛山市高明区更合镇金腾路1号   80.0   2.000   4.00
6   8003727727  2024-09-26                   广东省惠州市惠阳区大亚湾澳头荃湾综合港区  400.0  10.000  20.00
7   8003744009  2024-09-19                     广东省广州市白云区鸦岗金沙围路11号   25.0   0.500   1.00
8   8003744010  2024-09-20                 广东省东莞市麻涌镇麻涌镇新沙工业区海力饲料厂  150.0   3.000   6.00
9   8003744010  2024-09-20                 广东省东莞市麻涌镇麻涌镇新沙工业区海力饲料厂  150.0   0.100   6.00
10  8003746232  2024-09-23                     广东省佛山市高明区荷城街道三洲兴盛路  200.0   5.000  10.00
11  8003747613  2024-09-20                    广东省佛山市高明区更合镇合塘路184号  408.0   0.010  20.40
12  8003746113  2024-09-22                    广东省广州市南沙区榄核镇大坳村工业B区  400.0  10.000  20.00
13  8003747611  2024-09-20                      广东省江门市开平市金鸡镇文乐街1号  320.0   8.000  16.00
14  8003747612  2024-09-20                    广东省佛山市高明区更合镇合塘路184号   32.0   0.800   1.60
15  8003747590  2024-09-21                      广东省云浮市新兴县车岗镇工业开发区  100.0   2.000   4.00
16  8003746233  2024-09-20                  广东省广州市黄埔区横沙白街172号101房   50.0   1.000   2.00
17  8003746432  2024-09-23  广东省江门市蓬江区杜阮镇怡景大道振林饲料有限公司 江门 Guangdong  160.0   4.000   8.00
18  8003748235  2024-09-22                 广东省云浮市新兴县东成镇十里工业区联营饲料厂  800.0  20.000  40.00
19  8003748242  2024-09-22                     广东省云浮市郁南县大湾镇小桥头工业区  720.0  18.000  36.00
20  8003748240  2024-09-22                      广东省云浮市新兴县车岗镇工业开发区  200.0   5.000  10.00
21  8003748238  2024-09-22                         广东省云浮市新兴县勒竹镇榄根  400.0  10.000  20.00
22  8003748236  2024-09-22           广东省佛山市高明区更合镇高明温氏饲料厂Guangdong  600.0  15.000  30.00
23  8003748237  2024-09-22                      广东省云浮市新兴县稔村镇白土开发区  360.0   9.000  18.00
24  8003748241  2024-09-22                   广东省佛山市三水区南山镇六和镇城东路1号  640.0  16.000  32.00

已知以上数据,现在需求:
要求把收货地址中包含    东莞  或者惠州  或者佛山 的  并且日期一致的  记录合并  重量字段求和
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-18 12:48:44 | 显示全部楼层
wp231957 发表于 2024-11-18 12:48
>>> df
          客户单号      客户发货时间       ...


要将包含特定关键字的收货地址合并,并对同一天的重量进行求和,你可以使用 Pandas 的 `groupby` 和 `agg` 方法。首先,你需要筛选出地址中包含关键字 "东莞"、"惠州"、"佛山" 的记录,然后按照日期进行分组和求和。以下是示例代码:
import pandas as pd

# 假设已读取数据为 df
df = pd.read_excel('5.xlsx')

# 筛选出地址包含 "东莞"、"惠州" 或 "佛山" 的记录
keywords = ['东莞', '惠州', '佛山']
filtered_df = df[df['收货地址'].str.contains('|'.join(keywords))]

# 按客户发货时间分组,求重量的和
result_df = filtered_df.groupby('客户发货时间', as_index=False).agg({'重量(T)': 'sum'})

print(result_df)

说明:
- `str.contains('|'.join(keywords))`: 使用正则表达式将多个关键字用“或”条件连接,筛选包含这些关键字的记录。
- `groupby('客户发货时间')`: 根据日期进行分组。
- `.agg({'重量(T)': 'sum'})`: 对每个分组中的重量求和。
- `as_index=False`: 保证分组字段作为普通列返回,而不是索引。

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

使用道具 举报

 楼主| 发表于 2024-11-18 12:53:59 | 显示全部楼层
FishC 发表于 2024-11-18 12:48
要将包含特定关键字的收货地址合并,并对同一天的重量进行求和,你可以使用 Pandas 的 `groupby` 和 `a ...

其他的数据也是需要的,正常按照日期分组 然后追加到这个结果当中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-18 12:55:17 | 显示全部楼层
wp231957 发表于 2024-11-18 12:53
其他的数据也是需要的,正常按照日期分组 然后追加到 ...


如果需要保留其他数据,并按照日期分组,然后为一个含有特定地址的组合数据追加其他数据,可以通过 Pandas 的 `groupby` 和 `agg` 方法来进行处理。你可以对非聚合字段使用 `first`(或者其他需要的操作例如 `list` 等)来保持信息。以下是一个实现示例:
import pandas as pd

# 假设数据已读入并存在于 df 中
df = pd.read_excel('5.xlsx')

# 筛选出地址包含 "东莞"、"惠州" 或 "佛山" 的记录
keywords = ['东莞', '惠州', '佛山']
filtered_df = df[df['收货地址'].str.contains('|'.join(keywords))]

# 基于日期合并信息
result_df = filtered_df.groupby('客户发货时间', as_index=False).agg({
    '客户单号': 'first',    # 如果同一天有多个,可以用 'list' 来保留所有值
    '收货地址': 'first',   # 类似地,'list' 可以保留所有地址
    '总件数': 'sum',
    '重量(T)': 'sum',
    '体积': 'sum'
})

# 若原始数据中没有过滤掉的,也按照日期汇总,可以通过 append 的方法追加上
other_records = df[~df['收货地址'].str.contains('|'.join(keywords))]
other_grouped = other_records.groupby('客户发货时间', as_index=False).agg({
    '客户单号': 'first',
    '收货地址': 'first',
    '总件数': 'sum',
    '重量(T)': 'sum',
    '体积': 'sum'
})

# 把两个结果合并起来
final_result = pd.concat([result_df, other_grouped], ignore_index=True)

print(final_result)

说明:
- `groupby` 用于按日期分组。
- 对于希望保持在最终结果中的其他信息(比如客户单号、收货地址等),可以选择在 `agg` 方法中使用 `'first'`,而对于需要合计的数值列使用 `'sum'`。
- `pd.concat` 方法将包含特定地址的组合数据和其他数据合在一起,形成最终的结果。

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

使用道具 举报

 楼主| 发表于 2024-11-19 14:05:18 | 显示全部楼层
FishC 发表于 2024-11-18 12:55
如果需要保留其他数据,并按照日期分组,然后为一个含有特定地址的组合数据追加其他数据,可以通过 Pan ...

现在有这样一组数据
ADAKLDJ
DKJLAKSDJKA
SDJKLSAJKLAJD
SDJKLSDJDKLSA
DKLSDAJF;SASDL
AJDKL;DSAJKLAJ
DJFKLAJDFKLSA
FDSJKLFJSADLKDJFA
SDJFKLSDAJFKLSA
DJFKLSDADFJKLASDF
AJDKFJSADKFA
SDJFKSAJDFKLAS
DFJKSLAJDFKLA
DFSKALJSDFKLDFJPDFO
;SDJFJALSDKJF
ADJIIPQEURFLIAJSD'FJSADKL
QDFJALKJDFKL'Q
WEJKF

要求使用pandas 对每一行进行单独排序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-19 14:05:32 | 显示全部楼层
wp231957 发表于 2024-11-19 14:05
现在有这样一组数据
ADAKLDJ
DKJLAKSDJKA
SDJKLSAJ ...


可以使用 Pandas 的 `apply` 方法对 DataFrame 的每一行(或者特定列)进行操作。在您的场景中,需要对每一行的数据进行字符排序。以下是实现的方法:
import pandas as pd

# 假设数据已经以列表形式存在
data = [
    "ADAKLDJ", 
    "DKJLAKSDJKA", 
    "SDJKLSAJKLAJD", 
    "SDJKLSDJDKLSA", 
    "DKLSDAJF;SASDL", 
    "AJDKL;DSAJKLAJ", 
    "DJFKLAJDFKLSA", 
    "FDSJKLFJSADLKDJFA", 
    "SDJFKLSDAJFKLSA", 
    "DJFKLSDADFJKLASDF", 
    "AJDKFJSADKFA", 
    "SDJFKSAJDFKLAS", 
    "DFJKSLAJDFKLA", 
    "DFSKALJSDFKLDFJPDFO", 
    ";SDJFJALSDKJF", 
    "ADJIIPQEURFLIAJSD'FJSADKL", 
    "QDFJALKJDFKL'Q", 
    "WEJKF"
]

# 创建 DataFrame
df = pd.DataFrame(data, columns=['Text'])

# 对每一行的每个字符串进行排序
df['Sorted_Text'] = df['Text'].apply(lambda x: ''.join(sorted(x)))

# 输出结果
print(df['Sorted_Text'])

说明:
1. 使用 `pd.DataFrame` 将数据转化为 DataFrame。
2. 使用 `apply` 方法对列中的每个字符串应用 `sorted` 函数,然后用 `''.join()` 将排序后的字符重新组合成字符串。
3. 结果存储在新的列 `Sorted_Text` 中。

这样,每一行的字符都会被单独排序并保存。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-24 08:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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